supabee 0.3.2 → 0.3.4
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 +420 -328
- package/dist/commands/cutoff.d.ts +5 -0
- package/dist/commands/cutoff.js +49 -0
- package/dist/commands/cutoff.js.map +1 -0
- package/dist/commands/db-reset.d.ts +2 -0
- package/dist/commands/db-reset.js +119 -182
- package/dist/commands/db-reset.js.map +1 -1
- package/dist/commands/init.js +9 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migration.d.ts +18 -0
- package/dist/commands/migration.js +290 -0
- package/dist/commands/migration.js.map +1 -0
- package/dist/commands/sync.d.ts +1 -0
- package/dist/commands/sync.js +50 -2
- package/dist/commands/sync.js.map +1 -1
- package/dist/index.js +129 -88
- package/dist/index.js.map +1 -1
- package/dist/lib/constants.d.ts +3 -0
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/migration-classifier.d.ts +39 -0
- package/dist/lib/migration-classifier.js +321 -0
- package/dist/lib/migration-classifier.js.map +1 -0
- package/dist/lib/post-seed-cutoff.d.ts +24 -0
- package/dist/lib/post-seed-cutoff.js +195 -0
- package/dist/lib/post-seed-cutoff.js.map +1 -0
- package/dist/lib/subprocess.js +7 -7
- package/package.json +54 -53
- package/supabee.config.example.json +34 -29
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import readline from 'node:readline/promises';
|
|
4
|
+
import { stdin as input, stdout as output } from 'node:process';
|
|
5
|
+
import { classifyMigrations, resolveMarkers, } from '../lib/migration-classifier.js';
|
|
6
|
+
import { info, ok, sectionWithNote, title, warn } from '../lib/ui.js';
|
|
7
|
+
const DEFAULT_MIGRATIONS_DIR = 'supabase/migrations';
|
|
8
|
+
function absoluteMigrationsDir(dir) {
|
|
9
|
+
return path.resolve(process.cwd(), dir ?? DEFAULT_MIGRATIONS_DIR);
|
|
10
|
+
}
|
|
11
|
+
async function ensureDirectoryExists(dirPath) {
|
|
12
|
+
const stats = await fs.promises.stat(dirPath).catch(() => null);
|
|
13
|
+
if (!stats || !stats.isDirectory()) {
|
|
14
|
+
throw new Error(`Migrations directory not found: ${dirPath}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function recommendationText(result) {
|
|
18
|
+
if (result.classification === 'mixed') {
|
|
19
|
+
return 'Split file into schema-only and data-only migrations';
|
|
20
|
+
}
|
|
21
|
+
if (result.classification === 'unknown') {
|
|
22
|
+
return 'No automatic action';
|
|
23
|
+
}
|
|
24
|
+
if (!result.recommendedMarker) {
|
|
25
|
+
return 'No marker change needed';
|
|
26
|
+
}
|
|
27
|
+
return `Add ${result.recommendedMarker} marker`;
|
|
28
|
+
}
|
|
29
|
+
function markerLine(markerType, markers) {
|
|
30
|
+
if (markerType === 'data')
|
|
31
|
+
return `-- ${markers.dataMarker}`;
|
|
32
|
+
if (markerType === 'schema')
|
|
33
|
+
return `-- ${markers.schemaMarker}`;
|
|
34
|
+
throw new Error('Invalid marker type');
|
|
35
|
+
}
|
|
36
|
+
function prependMarker(sql, marker) {
|
|
37
|
+
if (sql.startsWith('\uFEFF')) {
|
|
38
|
+
const withoutBom = sql.slice(1);
|
|
39
|
+
return `\uFEFF${marker}\n\n${withoutBom}`;
|
|
40
|
+
}
|
|
41
|
+
return `${marker}\n\n${sql}`;
|
|
42
|
+
}
|
|
43
|
+
function removeMarkerLines(sql, markers) {
|
|
44
|
+
const hadBom = sql.startsWith('\uFEFF');
|
|
45
|
+
const raw = hadBom ? sql.slice(1) : sql;
|
|
46
|
+
const lines = raw.split('\n');
|
|
47
|
+
const markerValues = [markers.dataMarker, markers.schemaMarker];
|
|
48
|
+
let removed = false;
|
|
49
|
+
const kept = lines.filter((line) => {
|
|
50
|
+
const trimmed = line.trim();
|
|
51
|
+
for (const marker of markerValues) {
|
|
52
|
+
if (trimmed === `-- ${marker}` || trimmed === `--${marker}`) {
|
|
53
|
+
removed = true;
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
});
|
|
59
|
+
const updated = kept.join('\n');
|
|
60
|
+
return { updated: hadBom ? `\uFEFF${updated}` : updated, removed };
|
|
61
|
+
}
|
|
62
|
+
function printClassificationRow(result) {
|
|
63
|
+
console.log(info(`${result.fileName}`));
|
|
64
|
+
console.log(info(` class = ${result.classification} (${result.source})`));
|
|
65
|
+
console.log(info(` reason = ${result.reasons.join('; ')}`));
|
|
66
|
+
console.log(info(` recommendation = ${recommendationText(result)}`));
|
|
67
|
+
}
|
|
68
|
+
function printEvidenceRow(result) {
|
|
69
|
+
const markerBits = result.evidence.markerMatches.length > 0
|
|
70
|
+
? result.evidence.markerMatches.map((match) => `${match.marker}@L${match.line}`).join(', ')
|
|
71
|
+
: 'none';
|
|
72
|
+
const ddlBits = result.evidence.ddlMatches.length > 0
|
|
73
|
+
? result.evidence.ddlMatches.map((match) => `${match.pattern}@L${match.line}`).join(', ')
|
|
74
|
+
: 'none';
|
|
75
|
+
const dmlBits = result.evidence.dmlMatches.length > 0
|
|
76
|
+
? result.evidence.dmlMatches.map((match) => `${match.pattern}@L${match.line}`).join(', ')
|
|
77
|
+
: 'none';
|
|
78
|
+
console.log(info(` evidence.markers = ${markerBits}`));
|
|
79
|
+
console.log(info(` evidence.ddl = ${ddlBits}`));
|
|
80
|
+
console.log(info(` evidence.dml = ${dmlBits}`));
|
|
81
|
+
}
|
|
82
|
+
function summarizeResults(results) {
|
|
83
|
+
let dataCount = 0;
|
|
84
|
+
let schemaCount = 0;
|
|
85
|
+
let mixedCount = 0;
|
|
86
|
+
let unknownCount = 0;
|
|
87
|
+
let suggestedMarkerCount = 0;
|
|
88
|
+
for (const result of results) {
|
|
89
|
+
if (result.classification === 'data')
|
|
90
|
+
dataCount += 1;
|
|
91
|
+
if (result.classification === 'schema')
|
|
92
|
+
schemaCount += 1;
|
|
93
|
+
if (result.classification === 'mixed')
|
|
94
|
+
mixedCount += 1;
|
|
95
|
+
if (result.classification === 'unknown')
|
|
96
|
+
unknownCount += 1;
|
|
97
|
+
if (result.recommendedMarker)
|
|
98
|
+
suggestedMarkerCount += 1;
|
|
99
|
+
}
|
|
100
|
+
return { dataCount, schemaCount, mixedCount, unknownCount, suggestedMarkerCount };
|
|
101
|
+
}
|
|
102
|
+
export async function runMigrationAuditCommand(options = {}) {
|
|
103
|
+
const migrationsDir = absoluteMigrationsDir(options.migrationsDir);
|
|
104
|
+
await ensureDirectoryExists(migrationsDir);
|
|
105
|
+
const markers = resolveMarkers();
|
|
106
|
+
const results = await classifyMigrations({ migrationsDir });
|
|
107
|
+
const summary = summarizeResults(results);
|
|
108
|
+
if (options.json === true) {
|
|
109
|
+
const payload = {
|
|
110
|
+
metadata: {
|
|
111
|
+
migrationsDir,
|
|
112
|
+
dataMarker: markers.dataMarker,
|
|
113
|
+
schemaMarker: markers.schemaMarker,
|
|
114
|
+
verbose: options.verbose === true,
|
|
115
|
+
},
|
|
116
|
+
summary: {
|
|
117
|
+
data: summary.dataCount,
|
|
118
|
+
schema: summary.schemaCount,
|
|
119
|
+
mixed: summary.mixedCount,
|
|
120
|
+
unknown: summary.unknownCount,
|
|
121
|
+
suggestedMarkerUpdates: summary.suggestedMarkerCount,
|
|
122
|
+
},
|
|
123
|
+
results: results.map((result) => ({
|
|
124
|
+
fileName: result.fileName,
|
|
125
|
+
filePath: result.filePath,
|
|
126
|
+
timestamp: result.timestamp,
|
|
127
|
+
classification: result.classification,
|
|
128
|
+
source: result.source,
|
|
129
|
+
reasons: result.reasons,
|
|
130
|
+
recommendation: recommendationText(result),
|
|
131
|
+
recommendedMarker: result.recommendedMarker,
|
|
132
|
+
hasDataMarker: result.hasDataMarker,
|
|
133
|
+
hasSchemaMarker: result.hasSchemaMarker,
|
|
134
|
+
...(options.verbose === true ? { evidence: result.evidence } : {}),
|
|
135
|
+
})),
|
|
136
|
+
};
|
|
137
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
console.log(sectionWithNote(title('Migration audit'), 'Classifies migration files as data/schema/mixed/unknown.'));
|
|
141
|
+
console.log(info(`migrationsDir = ${migrationsDir}`));
|
|
142
|
+
console.log(info(`dataMarker = ${markers.dataMarker}`));
|
|
143
|
+
console.log(info(`schemaMarker = ${markers.schemaMarker}`));
|
|
144
|
+
console.log(info(`verbose = ${options.verbose === true ? 'true' : 'false'}`));
|
|
145
|
+
console.log('');
|
|
146
|
+
if (results.length === 0) {
|
|
147
|
+
console.log(warn('No migration files found.'));
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
for (const result of results) {
|
|
151
|
+
printClassificationRow(result);
|
|
152
|
+
if (options.verbose === true) {
|
|
153
|
+
printEvidenceRow(result);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
console.log('');
|
|
157
|
+
console.log(ok(`Summary: data=${summary.dataCount} schema=${summary.schemaCount} mixed=${summary.mixedCount} unknown=${summary.unknownCount}`));
|
|
158
|
+
console.log(info(`Suggested marker updates: ${summary.suggestedMarkerCount}`));
|
|
159
|
+
if (summary.mixedCount > 0) {
|
|
160
|
+
console.log(warn('Mixed files detected. Split schema and data into separate migration files.'));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export async function runMigrationMarkCommand(options = {}) {
|
|
164
|
+
const migrationsDir = absoluteMigrationsDir(options.migrationsDir);
|
|
165
|
+
await ensureDirectoryExists(migrationsDir);
|
|
166
|
+
const markers = resolveMarkers();
|
|
167
|
+
const results = await classifyMigrations({ migrationsDir });
|
|
168
|
+
const mixed = results.filter((result) => result.classification === 'mixed');
|
|
169
|
+
if (mixed.length > 0) {
|
|
170
|
+
const names = mixed.map((m) => m.fileName).join(', ');
|
|
171
|
+
throw new Error(`Cannot mark migrations while mixed schema+DML files exist: ${names}\nSplit each mixed migration into schema-only and data-only files, then re-run.`);
|
|
172
|
+
}
|
|
173
|
+
const candidates = results.filter((result) => result.recommendedMarker !== null);
|
|
174
|
+
console.log(sectionWithNote(title('Migration mark'), 'Suggests and applies marker comments to migration files.'));
|
|
175
|
+
console.log(info(`migrationsDir = ${migrationsDir}`));
|
|
176
|
+
console.log(info(`candidates = ${candidates.length}`));
|
|
177
|
+
console.log('');
|
|
178
|
+
if (candidates.length === 0) {
|
|
179
|
+
console.log(ok('No marker updates needed.'));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
for (const candidate of candidates) {
|
|
183
|
+
const marker = markerLine(candidate.recommendedMarker, markers);
|
|
184
|
+
console.log(info(`${candidate.fileName}`));
|
|
185
|
+
console.log(info(` add = ${marker}`));
|
|
186
|
+
console.log(info(` reason = ${candidate.reasons.join('; ')}`));
|
|
187
|
+
}
|
|
188
|
+
if (options.dryRun === true) {
|
|
189
|
+
console.log('');
|
|
190
|
+
console.log(info('Dry run only. Re-run without `--dry-run` to confirm and write markers.'));
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const confirmed = [];
|
|
194
|
+
if (options.yes === true) {
|
|
195
|
+
confirmed.push(...candidates);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
const rl = readline.createInterface({ input, output });
|
|
199
|
+
try {
|
|
200
|
+
for (const candidate of candidates) {
|
|
201
|
+
const marker = markerLine(candidate.recommendedMarker, markers);
|
|
202
|
+
const answer = await rl.question(`Add "${marker}" to ${candidate.fileName}? [y/N] `);
|
|
203
|
+
const accepted = answer.trim().toLowerCase();
|
|
204
|
+
if (accepted === 'y' || accepted === 'yes') {
|
|
205
|
+
confirmed.push(candidate);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
rl.close();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (confirmed.length === 0) {
|
|
214
|
+
console.log('');
|
|
215
|
+
console.log(warn('No marker updates selected. Nothing written.'));
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
for (const candidate of confirmed) {
|
|
219
|
+
const marker = markerLine(candidate.recommendedMarker, markers);
|
|
220
|
+
const original = await fs.promises.readFile(candidate.filePath, 'utf8');
|
|
221
|
+
const updated = prependMarker(original, marker);
|
|
222
|
+
await fs.promises.writeFile(candidate.filePath, updated, 'utf8');
|
|
223
|
+
console.log(ok(`Updated ${candidate.fileName}`));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
export async function runMigrationUnmarkCommand(options = {}) {
|
|
227
|
+
const migrationsDir = absoluteMigrationsDir(options.migrationsDir);
|
|
228
|
+
await ensureDirectoryExists(migrationsDir);
|
|
229
|
+
const markers = resolveMarkers();
|
|
230
|
+
const results = await classifyMigrations({ migrationsDir });
|
|
231
|
+
const candidates = results.filter((result) => result.hasDataMarker || result.hasSchemaMarker);
|
|
232
|
+
console.log(sectionWithNote(title('Migration unmark'), 'Removes marker comments from migration files.'));
|
|
233
|
+
console.log(info(`migrationsDir = ${migrationsDir}`));
|
|
234
|
+
console.log(info(`candidates = ${candidates.length}`));
|
|
235
|
+
console.log('');
|
|
236
|
+
if (candidates.length === 0) {
|
|
237
|
+
console.log(ok('No marker lines found.'));
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
for (const candidate of candidates) {
|
|
241
|
+
const removals = [];
|
|
242
|
+
if (candidate.hasDataMarker)
|
|
243
|
+
removals.push(`-- ${markers.dataMarker}`);
|
|
244
|
+
if (candidate.hasSchemaMarker)
|
|
245
|
+
removals.push(`-- ${markers.schemaMarker}`);
|
|
246
|
+
console.log(info(`${candidate.fileName}`));
|
|
247
|
+
console.log(info(` remove = ${removals.join(', ')}`));
|
|
248
|
+
console.log(info(` reason = explicit marker override cleanup`));
|
|
249
|
+
}
|
|
250
|
+
if (options.dryRun === true) {
|
|
251
|
+
console.log('');
|
|
252
|
+
console.log(info('Dry run only. Re-run without `--dry-run` to confirm and remove markers.'));
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const confirmed = [];
|
|
256
|
+
if (options.yes === true) {
|
|
257
|
+
confirmed.push(...candidates);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
const rl = readline.createInterface({ input, output });
|
|
261
|
+
try {
|
|
262
|
+
for (const candidate of candidates) {
|
|
263
|
+
const answer = await rl.question(`Remove markers from ${candidate.fileName}? [y/N] `);
|
|
264
|
+
const accepted = answer.trim().toLowerCase();
|
|
265
|
+
if (accepted === 'y' || accepted === 'yes') {
|
|
266
|
+
confirmed.push(candidate);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
finally {
|
|
271
|
+
rl.close();
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (confirmed.length === 0) {
|
|
275
|
+
console.log('');
|
|
276
|
+
console.log(warn('No files selected. Nothing written.'));
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
for (const candidate of confirmed) {
|
|
280
|
+
const original = await fs.promises.readFile(candidate.filePath, 'utf8');
|
|
281
|
+
const { updated, removed } = removeMarkerLines(original, markers);
|
|
282
|
+
if (!removed) {
|
|
283
|
+
console.log(warn(`Skipped ${candidate.fileName}; no marker line found at write time.`));
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
await fs.promises.writeFile(candidate.filePath, updated, 'utf8');
|
|
287
|
+
console.log(ok(`Updated ${candidate.fileName}`));
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/commands/migration.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/sync.d.ts
CHANGED
package/dist/commands/sync.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import { resolveCommandConfig } from '../lib/config.js';
|
|
3
|
-
import { info, ok, sectionWithNote, title } from '../lib/ui.js';
|
|
3
|
+
import { info, ok, sectionWithNote, title, warn } from '../lib/ui.js';
|
|
4
4
|
import { runSchemaCommand } from './schema.js';
|
|
5
5
|
import { runDataCommand } from './data.js';
|
|
6
|
-
import { runCommandToFile } from '../lib/subprocess.js';
|
|
6
|
+
import { runCommandCapture, runCommandToFile } from '../lib/subprocess.js';
|
|
7
|
+
import { compareMigrationVersions, isValidMigrationVersion, parseMigrationListOutput, } from '../lib/post-seed-cutoff.js';
|
|
7
8
|
function buildWorkflowArgs(inputFile, options) {
|
|
8
9
|
const args = ['--input', inputFile];
|
|
9
10
|
if (options.output)
|
|
@@ -22,7 +23,54 @@ async function assertDumpHasContent(filePath) {
|
|
|
22
23
|
throw new Error(`Supabase dump produced an empty file: ${filePath}\nAborting before split so existing output files are not cleared.`);
|
|
23
24
|
}
|
|
24
25
|
}
|
|
26
|
+
function latestVersionFromRows(rows, key) {
|
|
27
|
+
const versions = new Set();
|
|
28
|
+
for (const row of rows) {
|
|
29
|
+
const value = row[key];
|
|
30
|
+
if (isValidMigrationVersion(value))
|
|
31
|
+
versions.add(value);
|
|
32
|
+
}
|
|
33
|
+
let latest = null;
|
|
34
|
+
for (const version of versions) {
|
|
35
|
+
if (!latest || compareMigrationVersions(version, latest) > 0) {
|
|
36
|
+
latest = version;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return latest;
|
|
40
|
+
}
|
|
41
|
+
async function assertLinkedMigrationAlignmentForSync(force) {
|
|
42
|
+
try {
|
|
43
|
+
const { stdout } = await runCommandCapture('supabase', ['migration', 'list', '--linked']);
|
|
44
|
+
const rows = parseMigrationListOutput(stdout);
|
|
45
|
+
if (rows.length === 0) {
|
|
46
|
+
if (force) {
|
|
47
|
+
console.log(warn('Linked migration alignment preflight returned no rows. Continuing due to --force.'));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
throw new Error('Linked migration alignment preflight returned no rows.');
|
|
51
|
+
}
|
|
52
|
+
const latestLocal = latestVersionFromRows(rows, 'local');
|
|
53
|
+
const latestRemote = latestVersionFromRows(rows, 'remote');
|
|
54
|
+
if (latestLocal === latestRemote)
|
|
55
|
+
return;
|
|
56
|
+
const message = `Local/remote migrations are not aligned (latestLocal=${latestLocal ?? '(none)'} latestRemote=${latestRemote ?? '(none)'}).`;
|
|
57
|
+
if (force) {
|
|
58
|
+
console.log(warn(`${message} Continuing due to --force.`));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
throw new Error(`${message} Re-run with --force to override.`);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (force) {
|
|
65
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
66
|
+
console.log(warn(`Could not validate linked migration alignment. Continuing due to --force. Details: ${message}`));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
25
72
|
export async function runSyncCommand(target, options = {}) {
|
|
73
|
+
await assertLinkedMigrationAlignmentForSync(options.force === true);
|
|
26
74
|
const resolved = target === 'schema'
|
|
27
75
|
? resolveCommandConfig('schema', { input: options.input, output: options.output })
|
|
28
76
|
: resolveCommandConfig('data', { input: options.input, output: options.output });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
|