supabee 0.2.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,239 @@
1
+ # Supabee
2
+
3
+ [![CI](https://github.com/kaihochak/supabee/actions/workflows/ci.yml/badge.svg)](https://github.com/kaihochak/supabee/actions/workflows/ci.yml)
4
+ [![npm version](https://img.shields.io/npm/v/supabee)](https://www.npmjs.com/package/supabee)
5
+ [![license](https://img.shields.io/npm/l/supabee)](./LICENSE)
6
+
7
+ Split large Supabase schema and data dump files into smaller, organized, version-control-friendly SQL files.
8
+
9
+ ## Why?
10
+
11
+ When you run `supabase db dump`, you get a single monolithic SQL file that can be thousands of lines long. This makes it hard to:
12
+
13
+ - **Review changes** in pull requests (one giant diff vs. focused per-table diffs)
14
+ - **Navigate** your database structure (finding a specific table in 5000 lines vs. opening a file)
15
+ - **Seed selectively** (load only what you need instead of everything)
16
+ - **Resolve merge conflicts** (conflicts in small files vs. one massive file)
17
+
18
+ `supabee` takes those dump files and splits them into categorized, ordered files that reconstruct back to the original — verified by built-in validation.
19
+
20
+ ## Prerequisites
21
+
22
+ - [Node.js](https://nodejs.org/) >= 18
23
+ - [Supabase CLI](https://supabase.com/docs/guides/cli/getting-started) installed and authenticated
24
+
25
+ ## Install
26
+
27
+ ```bash
28
+ npm install --save-dev supabee
29
+ ```
30
+
31
+ ## Setup
32
+
33
+ ### 1. Initialize config
34
+
35
+ Run `init` to generate `supabee.config.json` (if it doesn't exist) and update `supabase/config.toml` seed paths:
36
+
37
+ ```bash
38
+ npx supabee init
39
+ ```
40
+
41
+ Review the generated `supabee.config.json` and adjust paths/limits for your project.
42
+
43
+ ### 2. Link your Supabase project
44
+
45
+ If you haven't already, link your local repo to your Supabase project. This is required before you can dump schema or data:
46
+
47
+ ```bash
48
+ supabase link
49
+ ```
50
+
51
+ You'll be prompted for your project ref and database password. See the [Supabase CLI docs](https://supabase.com/docs/reference/cli/supabase-link) for details.
52
+
53
+ ### 3. Dump schema and data
54
+
55
+ ```bash
56
+ supabase db dump > supabase/schemas/prod-schemas.sql
57
+ supabase db dump --data-only > supabase/seeds/prod-data.sql
58
+ ```
59
+
60
+ ### 4. Split, reconstruct, and validate
61
+
62
+ ```bash
63
+ supabee schema
64
+ supabee data
65
+ ```
66
+
67
+ Each command runs the full chain: **split** → **reconstruct** → **validate**.
68
+
69
+ ## Commands
70
+
71
+ ### `init`
72
+
73
+ Creates `supabee.config.json` if missing, then updates `supabase/config.toml` `[db.seed].sql_paths` so Supabase knows where to find your split seed files.
74
+
75
+ ```bash
76
+ supabee init
77
+ ```
78
+
79
+ ### `schema`
80
+
81
+ Splits a schema dump into categorized folders:
82
+
83
+ ```
84
+ supabase/schemas/split/
85
+ ├── 00_extensions/
86
+ ├── 01_setup/
87
+ ├── 02_types/
88
+ ├── 03_functions/
89
+ ├── 04_tables/
90
+ ├── 05_views/
91
+ ├── 06_constraints/
92
+ ├── 07_indexes/
93
+ ├── 08_foreign_keys/
94
+ ├── 09_rls/
95
+ ├── 10_permissions/
96
+ ├── 11_ownership/
97
+ └── 12_others/
98
+ ```
99
+
100
+ ```bash
101
+ # Full chain (split → reconstruct → validate)
102
+ supabee schema
103
+
104
+ # Individual steps
105
+ supabee schema split
106
+ supabee schema reconstruct
107
+ supabee schema validate
108
+ ```
109
+
110
+ ### `data`
111
+
112
+ Splits a data dump into per-table files with configurable row/statement limits:
113
+
114
+ ```bash
115
+ # Full chain (split → reconstruct → validate)
116
+ supabee data
117
+
118
+ # Individual steps
119
+ supabee data split
120
+ supabee data reconstruct
121
+ supabee data validate
122
+ ```
123
+
124
+ ### Overriding paths
125
+
126
+ All commands accept `--input` and `--output` flags:
127
+
128
+ ```bash
129
+ supabee schema split --input path/to/schema.sql --output path/to/split
130
+ supabee data split --input path/to/data.sql --output path/to/split --backup
131
+ ```
132
+
133
+ Use `--backup` to save the existing split directory before overwriting.
134
+
135
+ ## Configuration
136
+
137
+ `supabee` reads `supabee.config.json` from your project root.
138
+
139
+ **Precedence:** CLI flags > config file > built-in defaults.
140
+
141
+ If the config file is missing, built-in defaults are used. Run `supabee init` to generate one.
142
+
143
+ Legacy support: `supabase-splitter.config.json` is still recognized, but `supabee.config.json` is preferred.
144
+
145
+ ### Full config reference
146
+
147
+ ```json
148
+ {
149
+ "schema": {
150
+ "input": "supabase/schemas/prod-schemas.sql",
151
+ "output": "supabase/schemas/split",
152
+ "reconstructed": "supabase/schemas/reconstructed-schemas.sql",
153
+ "keepFiles": []
154
+ },
155
+ "data": {
156
+ "input": "supabase/seeds/prod-data.sql",
157
+ "output": "supabase/seeds/split",
158
+ "reconstructed": "supabase/seeds/reconstructed-data.sql",
159
+ "maxLinesPerFile": 2000,
160
+ "maxStatementsPerFile": 20,
161
+ "maxRowsPerInsert": 200,
162
+ "tableRules": {},
163
+ "keepFiles": [],
164
+ "ignoreInReconstruct": []
165
+ },
166
+ "init": {
167
+ "seedSqlPaths": ["./seeds/split/*.sql"]
168
+ }
169
+ }
170
+ ```
171
+
172
+ | Key | Description |
173
+ |-----|-------------|
174
+ | `schema.input` | Path to your schema dump file |
175
+ | `schema.output` | Directory for split schema files |
176
+ | `schema.reconstructed` | Path for the reconstructed schema (used in validation) |
177
+ | `schema.keepFiles` | Files in the split dir to preserve across re-splits (restored from backup) |
178
+ | `data.input` | Path to your data dump file |
179
+ | `data.output` | Directory for split data files |
180
+ | `data.reconstructed` | Path for the reconstructed data (used in validation) |
181
+ | `data.maxLinesPerFile` | Max lines per split file (default: 2000) |
182
+ | `data.maxStatementsPerFile` | Max INSERT statements per file (default: 20) |
183
+ | `data.maxRowsPerInsert` | Max rows per INSERT statement (default: 200) |
184
+ | `data.tableRules` | Per-table overrides (see below) |
185
+ | `data.keepFiles` | Files in the split dir to preserve across re-splits |
186
+ | `data.ignoreInReconstruct` | Files to skip during reconstruction |
187
+ | `init.seedSqlPaths` | Paths written to `supabase/config.toml` `[db.seed].sql_paths` |
188
+
189
+ ### Table-specific rules
190
+
191
+ Override limits or skip specific tables:
192
+
193
+ ```json
194
+ {
195
+ "data": {
196
+ "tableRules": {
197
+ "public.cities": {
198
+ "maxLinesPerFile": 800,
199
+ "maxStatementsPerFile": 8,
200
+ "maxRowsPerInsert": 80
201
+ },
202
+ "public.audit_logs": {
203
+ "skip": true
204
+ }
205
+ }
206
+ }
207
+ }
208
+ ```
209
+
210
+ ## Flags
211
+
212
+ Both `schema` and `data` support:
213
+
214
+ - `--input`: source SQL file
215
+ - `--output`: output path (split dir for `split`, reconstructed file for `reconstruct`/`validate`)
216
+ - `--backup`: backup dirty split directory before running split
217
+
218
+ For `validate`, you can pass reconstructed path either as `--output <path>` or as the second positional argument.
219
+
220
+ ## Help
221
+
222
+ ```bash
223
+ supabee --help
224
+ supabee init --help
225
+ supabee schema --help
226
+ supabee data --help
227
+ ```
228
+
229
+ ## Development
230
+
231
+ ```bash
232
+ npm install
233
+ npm run typecheck
234
+ npm run build
235
+ npm run test
236
+ npm run pack:check
237
+ ```
238
+
239
+ RC gate checklist: `docs/rc-checklist.md`
@@ -0,0 +1 @@
1
+ export declare function runDataCommand(args: string[]): Promise<void>;
@@ -0,0 +1,372 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { info, ok, error as errText } from '../lib/ui.js';
4
+ import { resolveCommandConfig } from '../lib/config.js';
5
+ import { prepareSplitOutputDir } from '../lib/output.js';
6
+ import { runStepCommand } from '../lib/step-command.js';
7
+ function countLines(str) {
8
+ return str.split('\n').length;
9
+ }
10
+ function countRowsInInsertStatement(statement) {
11
+ const lines = statement.split('\n');
12
+ let valuesStartIndex = -1;
13
+ for (let i = 0; i < lines.length; i += 1) {
14
+ if (lines[i].trim().toUpperCase().includes('VALUES')) {
15
+ valuesStartIndex = i;
16
+ break;
17
+ }
18
+ }
19
+ if (valuesStartIndex === -1)
20
+ return 0;
21
+ const valueLines = lines.slice(valuesStartIndex + 1);
22
+ let rowCount = 0;
23
+ let parenCount = 0;
24
+ let inString = false;
25
+ let stringChar = '';
26
+ for (const line of valueLines) {
27
+ for (let i = 0; i < line.length; i += 1) {
28
+ const char = line[i];
29
+ const prevChar = i > 0 ? line[i - 1] : '';
30
+ if (!inString) {
31
+ if (char === "'" || char === '"') {
32
+ inString = true;
33
+ stringChar = char;
34
+ }
35
+ else if (char === '(') {
36
+ parenCount += 1;
37
+ }
38
+ else if (char === ')') {
39
+ parenCount -= 1;
40
+ }
41
+ }
42
+ else if (char === stringChar && prevChar !== '\\') {
43
+ inString = false;
44
+ stringChar = '';
45
+ }
46
+ if (!inString && parenCount === 0 && (char === ',' || char === ';'))
47
+ rowCount += 1;
48
+ }
49
+ }
50
+ return rowCount;
51
+ }
52
+ function breakDownInsertStatement(statement, tableName, maxRowsPerInsert) {
53
+ if (!Number.isFinite(maxRowsPerInsert) || maxRowsPerInsert <= 0)
54
+ return [statement];
55
+ const lines = statement.split('\n');
56
+ let valuesStartIndex = -1;
57
+ for (let i = 0; i < lines.length; i += 1) {
58
+ if (lines[i].trim().toUpperCase().includes('VALUES')) {
59
+ valuesStartIndex = i;
60
+ break;
61
+ }
62
+ }
63
+ if (valuesStartIndex === -1)
64
+ return [statement];
65
+ const header = lines.slice(0, valuesStartIndex + 1).join('\n');
66
+ const valueLines = lines.slice(valuesStartIndex + 1);
67
+ const valueRows = [];
68
+ let currentRow = '';
69
+ let parenCount = 0;
70
+ let inString = false;
71
+ let stringChar = '';
72
+ for (const line of valueLines) {
73
+ for (let i = 0; i < line.length; i += 1) {
74
+ const char = line[i];
75
+ const prevChar = i > 0 ? line[i - 1] : '';
76
+ if (!inString) {
77
+ if (char === "'" || char === '"') {
78
+ inString = true;
79
+ stringChar = char;
80
+ }
81
+ else if (char === '(') {
82
+ parenCount += 1;
83
+ }
84
+ else if (char === ')') {
85
+ parenCount -= 1;
86
+ }
87
+ }
88
+ else if (char === stringChar && prevChar !== '\\') {
89
+ inString = false;
90
+ stringChar = '';
91
+ }
92
+ currentRow += char;
93
+ if (!inString && parenCount === 0 && (char === ',' || char === ';')) {
94
+ valueRows.push(currentRow.trim().slice(0, -1));
95
+ currentRow = '';
96
+ }
97
+ }
98
+ if (currentRow.trim() && !currentRow.endsWith('\n'))
99
+ currentRow += '\n';
100
+ }
101
+ if (currentRow.trim())
102
+ valueRows.push(currentRow.trim());
103
+ if (valueRows.length <= maxRowsPerInsert)
104
+ return [statement];
105
+ const chunks = [];
106
+ for (let i = 0; i < valueRows.length; i += maxRowsPerInsert) {
107
+ const chunk = valueRows.slice(i, i + maxRowsPerInsert);
108
+ chunks.push(`${header}\n\t${chunk.join(',\n\t')};`);
109
+ }
110
+ console.log(info(`Broke down ${tableName} INSERT statement: ${valueRows.length} rows -> ${chunks.length} statements`));
111
+ return chunks;
112
+ }
113
+ function parseSeedContent(content) {
114
+ const lines = content.split('\n');
115
+ const tableContent = {};
116
+ let currentTable = null;
117
+ let currentStatement = [];
118
+ let inInsertStatement = false;
119
+ for (const line of lines) {
120
+ if (!inInsertStatement && (line.trim().startsWith('--') || line.trim() === ''))
121
+ continue;
122
+ const insertMatch = line.match(/^INSERT\s+INTO\s+(["`']?)([^."`'\s(]+)\1\.(["`']?)([^."`'\s(]+)\3/i);
123
+ if (insertMatch) {
124
+ if (inInsertStatement && currentTable && currentStatement.length > 0) {
125
+ if (!tableContent[currentTable])
126
+ tableContent[currentTable] = [];
127
+ tableContent[currentTable].push(currentStatement.join('\n'));
128
+ }
129
+ currentTable = `${insertMatch[2]}.${insertMatch[4]}`;
130
+ currentStatement = [line];
131
+ inInsertStatement = true;
132
+ continue;
133
+ }
134
+ if (inInsertStatement) {
135
+ currentStatement.push(line);
136
+ if (line.trim().endsWith(';') && currentTable) {
137
+ if (!tableContent[currentTable])
138
+ tableContent[currentTable] = [];
139
+ tableContent[currentTable].push(currentStatement.join('\n'));
140
+ currentStatement = [];
141
+ inInsertStatement = false;
142
+ }
143
+ }
144
+ }
145
+ if (inInsertStatement && currentTable && currentStatement.length > 0) {
146
+ if (!tableContent[currentTable])
147
+ tableContent[currentTable] = [];
148
+ tableContent[currentTable].push(currentStatement.join('\n'));
149
+ }
150
+ const sequenceLines = lines.filter((line) => line.includes('SEQUENCE SET') || (line.trim().startsWith('SELECT') && line.includes('setval')));
151
+ return { tableContent, sequenceLines, lineCount: lines.length };
152
+ }
153
+ function asPositiveNumber(value, fallback) {
154
+ return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback;
155
+ }
156
+ function getEffectiveTableLimits(table, config) {
157
+ const tableRule = config.tableRules?.[table];
158
+ if (!tableRule || typeof tableRule !== 'object')
159
+ return { ...config.limits, skip: false };
160
+ return {
161
+ maxLinesPerFile: asPositiveNumber(tableRule.maxLinesPerFile, config.limits.maxLinesPerFile),
162
+ maxStatementsPerFile: asPositiveNumber(tableRule.maxStatementsPerFile, config.limits.maxStatementsPerFile),
163
+ maxRowsPerInsert: asPositiveNumber(tableRule.maxRowsPerInsert, config.limits.maxRowsPerInsert),
164
+ skip: tableRule.skip === true,
165
+ };
166
+ }
167
+ function writeTableChunks(config, table, statements, counter) {
168
+ const tableLimits = getEffectiveTableLimits(table, config);
169
+ if (tableLimits.skip) {
170
+ console.log(info(`Skipping table by rule: ${table}`));
171
+ return counter;
172
+ }
173
+ const cleanTableName = table.replace(/\./g, '_');
174
+ let fileCounter = 0;
175
+ const processedStatements = [];
176
+ for (const statement of statements) {
177
+ const rowCount = countRowsInInsertStatement(statement);
178
+ if (rowCount > tableLimits.maxRowsPerInsert) {
179
+ processedStatements.push(...breakDownInsertStatement(statement, table, tableLimits.maxRowsPerInsert));
180
+ }
181
+ else {
182
+ processedStatements.push(statement);
183
+ }
184
+ }
185
+ statements = processedStatements;
186
+ const totalLines = statements.reduce((acc, stmt) => acc + countLines(stmt), 0);
187
+ const totalStatements = statements.length;
188
+ const needsSplitByLines = totalLines > tableLimits.maxLinesPerFile;
189
+ const needsSplitByStatements = totalStatements > tableLimits.maxStatementsPerFile;
190
+ const needsSplitting = needsSplitByLines || needsSplitByStatements;
191
+ if (!needsSplitting) {
192
+ const filename = `${String(counter).padStart(3, '0')}_${cleanTableName}.sql`;
193
+ fs.writeFileSync(path.join(config.outputDir, filename), statements.join('\n\n'));
194
+ console.log(info(`Created ${filename} with ${totalStatements} statements (${totalLines} lines)`));
195
+ return counter + 1;
196
+ }
197
+ let currentChunk = [];
198
+ let currentLines = 0;
199
+ let writtenFiles = 0;
200
+ for (const statement of statements) {
201
+ const statementLines = countLines(statement);
202
+ const wouldExceedLines = currentLines + statementLines > tableLimits.maxLinesPerFile;
203
+ const wouldExceedStatements = currentChunk.length >= tableLimits.maxStatementsPerFile;
204
+ if ((wouldExceedLines || wouldExceedStatements) && currentChunk.length > 0) {
205
+ const filename = `${String(counter).padStart(3, '0')}_${cleanTableName}_${String(fileCounter + 1).padStart(2, '0')}.sql`;
206
+ fs.writeFileSync(path.join(config.outputDir, filename), currentChunk.join('\n\n'));
207
+ console.log(info(`Created ${filename} with ${currentChunk.length} statements (${currentLines} lines)`));
208
+ currentChunk = [];
209
+ currentLines = 0;
210
+ fileCounter += 1;
211
+ writtenFiles += 1;
212
+ }
213
+ currentChunk.push(statement);
214
+ currentLines += statementLines;
215
+ }
216
+ if (currentChunk.length > 0) {
217
+ const filename = `${String(counter).padStart(3, '0')}_${cleanTableName}_${String(fileCounter + 1).padStart(2, '0')}.sql`;
218
+ fs.writeFileSync(path.join(config.outputDir, filename), currentChunk.join('\n\n'));
219
+ console.log(info(`Created ${filename} with ${currentChunk.length} statements (${currentLines} lines)`));
220
+ writtenFiles += 1;
221
+ }
222
+ console.log(info(`Table ${table} split into ${writtenFiles} files`));
223
+ return counter + 1;
224
+ }
225
+ function splitData(config) {
226
+ console.log(info(`Reading data file: ${config.inputFile}`));
227
+ const dataContent = fs.readFileSync(config.inputFile, 'utf8');
228
+ console.log(ok(`Loaded data file: ${(dataContent.length / 1024 / 1024).toFixed(2)}MB`));
229
+ fs.writeFileSync(path.join(config.outputDir, '001_setup.sql'), "-- Initial setup\nSET session_replication_role = 'replica';\n");
230
+ fs.writeFileSync(path.join(config.outputDir, '999_cleanup.sql'), '-- Cleanup\nRESET ALL;\n');
231
+ const parsed = parseSeedContent(dataContent);
232
+ console.log(info(`Processing ${parsed.lineCount} lines...`));
233
+ let counter = 2;
234
+ for (const [table, statements] of Object.entries(parsed.tableContent)) {
235
+ if (statements.length === 0)
236
+ continue;
237
+ counter = writeTableChunks(config, table, statements, counter);
238
+ }
239
+ if (parsed.sequenceLines.length > 0) {
240
+ const sequenceFile = `${String(counter).padStart(3, '0')}_sequences.sql`;
241
+ fs.writeFileSync(path.join(config.outputDir, sequenceFile), `-- Sequence values\n${parsed.sequenceLines.join('\n')}`);
242
+ console.log(info(`Created ${sequenceFile} with ${parsed.sequenceLines.length} sequence statements`));
243
+ }
244
+ const createdFiles = fs.readdirSync(config.outputDir).filter((file) => file.endsWith('.sql')).length;
245
+ console.log(ok(`Data split completed. ${createdFiles} files created in ${config.outputDir}.`));
246
+ }
247
+ function toRegexPattern(pattern) {
248
+ const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*');
249
+ return new RegExp(`^${escaped}$`);
250
+ }
251
+ function shouldIgnoreFile(fileName, patterns) {
252
+ if (!patterns || patterns.length === 0)
253
+ return false;
254
+ return patterns.some((pattern) => {
255
+ if (pattern.includes('*'))
256
+ return toRegexPattern(pattern).test(fileName);
257
+ return pattern === fileName || pattern.endsWith(`/${fileName}`);
258
+ });
259
+ }
260
+ function reconstructData(config) {
261
+ const files = fs
262
+ .readdirSync(config.outputDir)
263
+ .filter((file) => file.endsWith('.sql'))
264
+ .filter((file) => !shouldIgnoreFile(file, config.ignoreInReconstruct))
265
+ .sort((a, b) => a.localeCompare(b));
266
+ const contents = files.map((file) => fs.readFileSync(path.join(config.outputDir, file), 'utf8').trimEnd());
267
+ const reconstructed = `${contents.join('\n\n')}\n`;
268
+ fs.writeFileSync(config.reconstructedFile, reconstructed, 'utf8');
269
+ console.log(ok(`Reconstructed data written to: ${config.reconstructedFile}`));
270
+ }
271
+ function getRowCountByTable(tableContent) {
272
+ const counts = {};
273
+ for (const [table, statements] of Object.entries(tableContent)) {
274
+ counts[table] = statements.reduce((acc, statement) => acc + countRowsInInsertStatement(statement), 0);
275
+ }
276
+ return counts;
277
+ }
278
+ function validateData(config) {
279
+ const originalContent = fs.readFileSync(config.inputFile, 'utf8');
280
+ const reconstructedContent = fs.readFileSync(config.reconstructedFile, 'utf8');
281
+ const originalParsed = parseSeedContent(originalContent);
282
+ const reconstructedParsed = parseSeedContent(reconstructedContent);
283
+ const originalRows = getRowCountByTable(originalParsed.tableContent);
284
+ const reconstructedRows = getRowCountByTable(reconstructedParsed.tableContent);
285
+ const originalTables = Object.keys(originalRows).sort();
286
+ const reconstructedTables = Object.keys(reconstructedRows).sort();
287
+ const missingTables = originalTables.filter((table) => !Object.hasOwn(reconstructedRows, table));
288
+ const extraTables = reconstructedTables.filter((table) => !Object.hasOwn(originalRows, table));
289
+ const mismatchedCounts = [];
290
+ for (const table of originalTables) {
291
+ if (!Object.hasOwn(reconstructedRows, table))
292
+ continue;
293
+ if (originalRows[table] !== reconstructedRows[table]) {
294
+ mismatchedCounts.push({ table, original: originalRows[table], reconstructed: reconstructedRows[table] });
295
+ }
296
+ }
297
+ const originalSequenceCount = originalParsed.sequenceLines.length;
298
+ const reconstructedSequenceCount = reconstructedParsed.sequenceLines.length;
299
+ if (missingTables.length === 0 &&
300
+ extraTables.length === 0 &&
301
+ mismatchedCounts.length === 0 &&
302
+ originalSequenceCount === reconstructedSequenceCount) {
303
+ console.log(ok('Validation successful: row counts and sequence statements match.'));
304
+ console.log(info(`Tables: ${originalTables.length}`));
305
+ console.log(info(`Sequence statements: ${originalSequenceCount}`));
306
+ return true;
307
+ }
308
+ console.log(errText('Validation failed: reconstructed data does not match original source.'));
309
+ if (missingTables.length > 0)
310
+ console.log(info(`Missing tables: ${missingTables.join(', ')}`));
311
+ if (extraTables.length > 0)
312
+ console.log(info(`Unexpected tables: ${extraTables.join(', ')}`));
313
+ if (mismatchedCounts.length > 0) {
314
+ console.log(info(`Row count mismatches: ${mismatchedCounts.length}`));
315
+ mismatchedCounts.slice(0, 10).forEach((item) => {
316
+ console.log(info(` ${item.table}: original=${item.original}, reconstructed=${item.reconstructed}`));
317
+ });
318
+ }
319
+ if (originalSequenceCount !== reconstructedSequenceCount) {
320
+ console.log(info(`Sequence mismatch: original=${originalSequenceCount}, reconstructed=${reconstructedSequenceCount}`));
321
+ }
322
+ return false;
323
+ }
324
+ export async function runDataCommand(args) {
325
+ await runStepCommand(args, {
326
+ commandName: 'data',
327
+ commandDisplayName: 'Data',
328
+ detailNote: (step) => ({
329
+ split: ' Splitting data into files...',
330
+ reconstruct: ' Reconstructing data SQL from split files...',
331
+ validate: ' Validating reconstructed data against original...',
332
+ })[step],
333
+ buildDefaults: () => resolveCommandConfig('data', {}),
334
+ getDetailLines: (step, config) => {
335
+ if (step === 'split') {
336
+ return [
337
+ `input = ${config.inputFile}`,
338
+ `output = ${config.outputDir}`,
339
+ `maxLinesPerFile = ${config.limits.maxLinesPerFile}`,
340
+ `maxStatementsPerFile = ${config.limits.maxStatementsPerFile}`,
341
+ `maxRowsPerInsert = ${config.limits.maxRowsPerInsert}`,
342
+ `tableRules = ${Object.keys(config.tableRules || {}).length}`,
343
+ `keepFiles = ${config.keepFiles.length}`,
344
+ ];
345
+ }
346
+ if (step === 'reconstruct') {
347
+ return [
348
+ `input = ${config.outputDir}`,
349
+ `reconstructed = ${config.reconstructedFile}`,
350
+ `ignoreInReconstruct = ${config.ignoreInReconstruct.length}`,
351
+ ];
352
+ }
353
+ return [
354
+ `input = ${config.inputFile}`,
355
+ `reconstructed = ${config.reconstructedFile}`,
356
+ ];
357
+ },
358
+ actions: {
359
+ split: async ({ config, options }) => {
360
+ await prepareSplitOutputDir(config.outputDir, options.backup, 'Data', { keepFiles: config.keepFiles });
361
+ splitData(config);
362
+ },
363
+ reconstruct: async ({ config }) => {
364
+ reconstructData(config);
365
+ },
366
+ validate: async ({ config }) => {
367
+ return validateData(config);
368
+ },
369
+ },
370
+ });
371
+ }
372
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/commands/data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runInitCommand(args: string[]): Promise<void>;