@memberjunction/cli 5.41.0 → 5.42.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/dist/commands/bundle/index.d.ts +1 -0
- package/dist/commands/bundle/index.d.ts.map +1 -1
- package/dist/commands/bundle/index.js +7 -1
- package/dist/commands/bundle/index.js.map +1 -1
- package/dist/commands/codegen/index.d.ts +6 -16
- package/dist/commands/codegen/index.d.ts.map +1 -1
- package/dist/commands/codegen/index.js +6 -90
- package/dist/commands/codegen/index.js.map +1 -1
- package/dist/commands/codegen/usage.d.ts +7 -0
- package/dist/commands/codegen/usage.d.ts.map +1 -0
- package/dist/commands/codegen/usage.js +10 -0
- package/dist/commands/codegen/usage.js.map +1 -0
- package/dist/commands/install/claude.d.ts +35 -0
- package/dist/commands/install/claude.d.ts.map +1 -0
- package/dist/commands/install/claude.js +108 -0
- package/dist/commands/install/claude.js.map +1 -0
- package/dist/commands/install/index.d.ts +1 -0
- package/dist/commands/install/index.d.ts.map +1 -1
- package/dist/commands/install/index.js +4 -0
- package/dist/commands/install/index.js.map +1 -1
- package/dist/commands/migrate/convert.d.ts +59 -12
- package/dist/commands/migrate/convert.d.ts.map +1 -1
- package/dist/commands/migrate/convert.js +294 -21
- package/dist/commands/migrate/convert.js.map +1 -1
- package/dist/commands/migrate/rebake.d.ts +41 -0
- package/dist/commands/migrate/rebake.d.ts.map +1 -0
- package/dist/commands/migrate/rebake.js +193 -0
- package/dist/commands/migrate/rebake.js.map +1 -0
- package/dist/commands/plugin/add.d.ts +18 -0
- package/dist/commands/plugin/add.d.ts.map +1 -0
- package/dist/commands/plugin/add.js +53 -0
- package/dist/commands/plugin/add.js.map +1 -0
- package/dist/commands/sync/pull.d.ts +6 -26
- package/dist/commands/sync/pull.d.ts.map +1 -1
- package/dist/commands/sync/pull.js +6 -281
- package/dist/commands/sync/pull.js.map +1 -1
- package/dist/commands/sync/push.d.ts +8 -19
- package/dist/commands/sync/push.d.ts.map +1 -1
- package/dist/commands/sync/push.js +8 -328
- package/dist/commands/sync/push.js.map +1 -1
- package/dist/commands/sync/usage.d.ts +7 -0
- package/dist/commands/sync/usage.d.ts.map +1 -0
- package/dist/commands/sync/usage.js +10 -0
- package/dist/commands/sync/usage.js.map +1 -0
- package/dist/commands/update/claude.d.ts +37 -0
- package/dist/commands/update/claude.d.ts.map +1 -0
- package/dist/commands/update/claude.js +90 -0
- package/dist/commands/update/claude.js.map +1 -0
- package/dist/commands/usage.d.ts +17 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +29 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/hooks/prerun.d.ts.map +1 -1
- package/dist/hooks/prerun.js +49 -8
- package/dist/hooks/prerun.js.map +1 -1
- package/dist/lib/claude-pack/ManagedBlockEditor.d.ts +40 -0
- package/dist/lib/claude-pack/ManagedBlockEditor.d.ts.map +1 -0
- package/dist/lib/claude-pack/ManagedBlockEditor.js +127 -0
- package/dist/lib/claude-pack/ManagedBlockEditor.js.map +1 -0
- package/dist/lib/claude-pack/PackFetcher.d.ts +86 -0
- package/dist/lib/claude-pack/PackFetcher.d.ts.map +1 -0
- package/dist/lib/claude-pack/PackFetcher.js +163 -0
- package/dist/lib/claude-pack/PackFetcher.js.map +1 -0
- package/dist/lib/claude-pack/PackInstaller.d.ts +62 -0
- package/dist/lib/claude-pack/PackInstaller.d.ts.map +1 -0
- package/dist/lib/claude-pack/PackInstaller.js +197 -0
- package/dist/lib/claude-pack/PackInstaller.js.map +1 -0
- package/dist/lib/claude-pack/PackMerger.d.ts +61 -0
- package/dist/lib/claude-pack/PackMerger.d.ts.map +1 -0
- package/dist/lib/claude-pack/PackMerger.js +315 -0
- package/dist/lib/claude-pack/PackMerger.js.map +1 -0
- package/dist/lib/claude-pack/PackOutputFormatter.d.ts +29 -0
- package/dist/lib/claude-pack/PackOutputFormatter.d.ts.map +1 -0
- package/dist/lib/claude-pack/PackOutputFormatter.js +82 -0
- package/dist/lib/claude-pack/PackOutputFormatter.js.map +1 -0
- package/dist/lib/claude-pack/PackPaths.d.ts +80 -0
- package/dist/lib/claude-pack/PackPaths.d.ts.map +1 -0
- package/dist/lib/claude-pack/PackPaths.js +182 -0
- package/dist/lib/claude-pack/PackPaths.js.map +1 -0
- package/dist/lib/claude-pack/PackTypes.d.ts +124 -0
- package/dist/lib/claude-pack/PackTypes.d.ts.map +1 -0
- package/dist/lib/claude-pack/PackTypes.js +32 -0
- package/dist/lib/claude-pack/PackTypes.js.map +1 -0
- package/dist/lib/claude-pack/SettingsMerger.d.ts +47 -0
- package/dist/lib/claude-pack/SettingsMerger.d.ts.map +1 -0
- package/dist/lib/claude-pack/SettingsMerger.js +163 -0
- package/dist/lib/claude-pack/SettingsMerger.js.map +1 -0
- package/dist/lib/cli-plugins.d.ts +16 -0
- package/dist/lib/cli-plugins.d.ts.map +1 -0
- package/dist/lib/cli-plugins.js +26 -0
- package/dist/lib/cli-plugins.js.map +1 -0
- package/dist/lib/domain-usage-command.d.ts +16 -0
- package/dist/lib/domain-usage-command.d.ts.map +1 -0
- package/dist/lib/domain-usage-command.js +23 -0
- package/dist/lib/domain-usage-command.js.map +1 -0
- package/dist/lib/usage-render.d.ts +14 -0
- package/dist/lib/usage-render.d.ts.map +1 -0
- package/dist/lib/usage-render.js +64 -0
- package/dist/lib/usage-render.js.map +1 -0
- package/dist/light-commands.d.ts.map +1 -1
- package/dist/light-commands.js +11 -0
- package/dist/light-commands.js.map +1 -1
- package/oclif.manifest.json +815 -135
- package/package.json +17 -15
|
@@ -1,23 +1,38 @@
|
|
|
1
1
|
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { convertFile, getRulesForDialects, createConversionStats, deduplicateEntityFieldSequences, convertMigration, IncrementalBaker, } from '@memberjunction/sql-converter';
|
|
6
|
+
import { MJPostgresTranspiler } from '@memberjunction/sqlglot-ts';
|
|
2
7
|
/**
|
|
3
8
|
* CLI command to discover and convert T-SQL migrations to PostgreSQL.
|
|
4
9
|
*
|
|
5
10
|
* Scans the SQL Server migrations directory, identifies files that don't
|
|
6
11
|
* have a corresponding .pg.sql counterpart in the PG migrations directory,
|
|
7
|
-
* and converts them
|
|
12
|
+
* and converts them.
|
|
13
|
+
*
|
|
14
|
+
* Two strategies:
|
|
15
|
+
* - `--split` (split-and-regenerate, the standard path): classify content by the
|
|
16
|
+
* generator that produced it, transpile only hand-written DDL via the AST dialect
|
|
17
|
+
* (sqlglot `mj_postgres.py`), drop CodeGen objects (regenerated by `mj codegen`)
|
|
18
|
+
* and mj-sync metadata (re-seeded by `mj sync push`), and surface every gap loudly.
|
|
19
|
+
* Requires Python 3 with sqlglot (`pip install sqlglot`; set MJ_SQLGLOT_PYTHON if
|
|
20
|
+
* not `python3` on PATH).
|
|
21
|
+
* - default (legacy): the regex-based BatchConverter rule pipeline, which converts
|
|
22
|
+
* everything including appended CodeGen output. Retained for compatibility.
|
|
8
23
|
*
|
|
9
24
|
* Usage:
|
|
10
|
-
* mj migrate convert
|
|
11
|
-
* mj migrate convert --file V20260401__foo.sql
|
|
12
|
-
* mj migrate convert --dry-run
|
|
13
|
-
* mj migrate convert
|
|
25
|
+
* mj migrate convert --split # Standard split-and-regenerate conversion
|
|
26
|
+
* mj migrate convert --split --file V20260401__foo.sql
|
|
27
|
+
* mj migrate convert --split --dry-run
|
|
28
|
+
* mj migrate convert # Legacy regex pipeline
|
|
14
29
|
*/
|
|
15
30
|
export default class MigrateConvert extends Command {
|
|
16
|
-
static { this.description = 'Convert T-SQL migrations to PostgreSQL
|
|
31
|
+
static { this.description = 'Convert T-SQL migrations to PostgreSQL'; }
|
|
17
32
|
static { this.examples = [
|
|
18
|
-
'<%= config.bin %> migrate convert',
|
|
19
|
-
'<%= config.bin %> migrate convert --dry-run',
|
|
20
|
-
'<%= config.bin %> migrate convert --file V202604060452__v5.24.x__KnowledgeHub.sql',
|
|
33
|
+
'<%= config.bin %> migrate convert --split',
|
|
34
|
+
'<%= config.bin %> migrate convert --split --dry-run',
|
|
35
|
+
'<%= config.bin %> migrate convert --split --file V202604060452__v5.24.x__KnowledgeHub.sql',
|
|
21
36
|
'<%= config.bin %> migrate convert --source-dir ./migrations/v5 --output-dir ./migrations-pg/v5',
|
|
22
37
|
'<%= config.bin %> migrate convert --verbose',
|
|
23
38
|
]; }
|
|
@@ -50,12 +65,38 @@ export default class MigrateConvert extends Command {
|
|
|
50
65
|
description: 'Show per-statement progress',
|
|
51
66
|
default: false,
|
|
52
67
|
}),
|
|
68
|
+
split: Flags.boolean({
|
|
69
|
+
description: 'Split-and-regenerate (the standard path): transpile only hand-written DDL via the AST ' +
|
|
70
|
+
'dialect; CodeGen objects are regenerated by `mj codegen` and mj-sync metadata re-seeded ' +
|
|
71
|
+
'by `mj sync push`; every conversion gap is surfaced and fails the run unless --allow-gaps.',
|
|
72
|
+
default: false,
|
|
73
|
+
}),
|
|
74
|
+
'allow-gaps': Flags.boolean({
|
|
75
|
+
description: 'With --split: exit 0 even when migrations have conversion gaps (hand-authoring needed ' +
|
|
76
|
+
'or unhandled statements). Gaps are still embedded as comments and listed in the summary.',
|
|
77
|
+
default: false,
|
|
78
|
+
}),
|
|
79
|
+
'bake-codegen': Flags.boolean({
|
|
80
|
+
description: 'With --split: bake native PG CodeGen objects inline per migration (Path C), so the set ' +
|
|
81
|
+
'deploys with `mj migrate` alone — no `mj codegen` step. Requires a LIVE working PG database ' +
|
|
82
|
+
'(DB_PLATFORM=postgresql + PG_* env, same as `mj codegen`) seeded to the state just BEFORE ' +
|
|
83
|
+
'the migrations being converted (typically the latest baseline); the converter brings it ' +
|
|
84
|
+
'forward in committed order as it bakes. Not compatible with --dry-run.',
|
|
85
|
+
default: false,
|
|
86
|
+
}),
|
|
53
87
|
}; }
|
|
54
88
|
async run() {
|
|
55
89
|
const { flags } = await this.parse(MigrateConvert);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
90
|
+
if (flags['bake-codegen']) {
|
|
91
|
+
if (!flags.split)
|
|
92
|
+
this.error('--bake-codegen requires --split.');
|
|
93
|
+
if (flags['dry-run'])
|
|
94
|
+
this.error('--bake-codegen mutates a live working DB and is incompatible with --dry-run.');
|
|
95
|
+
}
|
|
96
|
+
if (flags.split) {
|
|
97
|
+
await this.runSplit(flags);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
59
100
|
const sourceDir = path.resolve(flags['source-dir']);
|
|
60
101
|
const outputDir = path.resolve(flags['output-dir']);
|
|
61
102
|
// Verify directories exist
|
|
@@ -72,7 +113,7 @@ export default class MigrateConvert extends Command {
|
|
|
72
113
|
this.error('No conversion rules found for tsql -> postgres');
|
|
73
114
|
}
|
|
74
115
|
// Discover migrations
|
|
75
|
-
const unconverted = this.discoverUnconverted(sourceDir, outputDir, flags.file
|
|
116
|
+
const unconverted = this.discoverUnconverted(sourceDir, outputDir, flags.file);
|
|
76
117
|
if (unconverted.length === 0) {
|
|
77
118
|
this.log('All migrations are already converted. Nothing to do.');
|
|
78
119
|
return;
|
|
@@ -149,20 +190,252 @@ export default class MigrateConvert extends Command {
|
|
|
149
190
|
}
|
|
150
191
|
}
|
|
151
192
|
/**
|
|
152
|
-
*
|
|
193
|
+
* Split-and-regenerate conversion (the standard path). Classification routes
|
|
194
|
+
* content by the generator that produced it; the AST dialect transpiles what's
|
|
195
|
+
* kept. Contract: nothing is dropped silently —
|
|
196
|
+
* - needs-hand migrations are written as `<name>.pg.sql.needs-hand` (NOT a
|
|
197
|
+
* discoverable `.pg.sql`, so the migration stays visibly unconverted until a
|
|
198
|
+
* human finishes it) and fail the run;
|
|
199
|
+
* - statements the dialect couldn't emit are embedded as gap comments in the
|
|
200
|
+
* output, listed in the summary, and fail the run unless --allow-gaps.
|
|
153
201
|
*
|
|
154
|
-
*
|
|
155
|
-
|
|
202
|
+
* See plans/pg-migration-architecture/SPLIT_AND_REGENERATE_PROPOSAL.md.
|
|
203
|
+
*/
|
|
204
|
+
async runSplit(flags) {
|
|
205
|
+
const sourceDir = path.resolve(flags['source-dir']);
|
|
206
|
+
const outputDir = path.resolve(flags['output-dir']);
|
|
207
|
+
if (!fs.existsSync(sourceDir))
|
|
208
|
+
this.error(`Source directory not found: ${sourceDir}`);
|
|
209
|
+
if (!fs.existsSync(outputDir))
|
|
210
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
211
|
+
const unconverted = this.discoverUnconverted(sourceDir, outputDir, flags.file);
|
|
212
|
+
if (unconverted.length === 0) {
|
|
213
|
+
this.log('All migrations are already converted. Nothing to do.');
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
const transpiler = await this.buildTranspiler(sourceDir);
|
|
217
|
+
// Select the per-migration conversion: inline-baking (live DB, CodeGen baked natively) or
|
|
218
|
+
// the default transpile-only path (CodeGen regenerated by `mj codegen` at deploy).
|
|
219
|
+
const bakeCodegen = flags['bake-codegen'];
|
|
220
|
+
const baker = bakeCodegen ? await this.buildBaker(transpiler, flags.schema) : null;
|
|
221
|
+
const convertOne = (sql, fileName) => baker
|
|
222
|
+
? baker.bakeMigration(sql, fileName)
|
|
223
|
+
: convertMigration(sql, fileName, { schema: flags.schema, includeHeader: !flags['no-header'], transpiler });
|
|
224
|
+
if (bakeCodegen)
|
|
225
|
+
this.log(`\nInline CodeGen baking ENABLED — bringing the working DB forward as each migration bakes.`);
|
|
226
|
+
const converted = [];
|
|
227
|
+
const regenReseed = [];
|
|
228
|
+
const needsHand = [];
|
|
229
|
+
const withUnhandled = [];
|
|
230
|
+
const gapReport = [];
|
|
231
|
+
for (const m of unconverted) {
|
|
232
|
+
const sql = fs.readFileSync(path.join(sourceDir, m.SourceFile), 'utf8');
|
|
233
|
+
let result;
|
|
234
|
+
try {
|
|
235
|
+
result = await convertOne(sql, m.SourceFile);
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
this.error(`Conversion failed for ${m.SourceFile}: ${err instanceof Error ? err.message : String(err)}`);
|
|
239
|
+
}
|
|
240
|
+
// A needs-hand migration is NEVER written as a discoverable .pg.sql — that
|
|
241
|
+
// would mark it converted forever and let Flyway apply an incomplete file.
|
|
242
|
+
// The .needs-hand artifact carries the transpiled DDL + gap comments for the
|
|
243
|
+
// human (or LLM last-mile pass) to finish, then rename to .pg.sql.
|
|
244
|
+
const isNeedsHand = result.status === 'needs-hand-authoring';
|
|
245
|
+
const outName = isNeedsHand ? `${m.OutputFile}.needs-hand` : m.OutputFile;
|
|
246
|
+
const outPath = path.join(outputDir, outName);
|
|
247
|
+
if (!flags['dry-run']) {
|
|
248
|
+
if (isNeedsHand && fs.existsSync(outPath)) {
|
|
249
|
+
// Someone may be mid-edit on the artifact — never clobber it on a re-run.
|
|
250
|
+
this.warn(`${outName} already exists — not overwritten (delete it to regenerate).`);
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
fs.writeFileSync(outPath, result.pgSQL);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (result.status === 'needs-hand-authoring') {
|
|
257
|
+
needsHand.push({ file: m.SourceFile, routines: result.handProcedural });
|
|
258
|
+
}
|
|
259
|
+
else if (result.status === 'reseed-or-regen-only') {
|
|
260
|
+
regenReseed.push(m.SourceFile);
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
converted.push(m.SourceFile);
|
|
264
|
+
}
|
|
265
|
+
if (result.unhandled.length > 0) {
|
|
266
|
+
withUnhandled.push({ file: m.SourceFile, count: result.unhandled.length });
|
|
267
|
+
}
|
|
268
|
+
if (result.status === 'needs-hand-authoring' || result.unhandled.length > 0) {
|
|
269
|
+
gapReport.push({
|
|
270
|
+
sourceFile: m.SourceFile,
|
|
271
|
+
outputFile: outName,
|
|
272
|
+
status: result.status,
|
|
273
|
+
handProcedural: result.handProcedural,
|
|
274
|
+
unhandled: result.unhandled,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// The consolidated gap artifact — everything a build engineer (or an LLM pass they
|
|
279
|
+
// drive) needs to finish the conversion, in one machine-readable file.
|
|
280
|
+
if (!flags['dry-run']) {
|
|
281
|
+
const reportPath = path.join(outputDir, 'conversion-gaps.report.json');
|
|
282
|
+
if (gapReport.length > 0) {
|
|
283
|
+
fs.writeFileSync(reportPath, JSON.stringify({ generatedAt: new Date().toISOString(), sourceDir, gaps: gapReport }, null, 2));
|
|
284
|
+
this.log(`\nGap report written: ${reportPath}`);
|
|
285
|
+
}
|
|
286
|
+
else if (fs.existsSync(reportPath)) {
|
|
287
|
+
fs.unlinkSync(reportPath); // clean run — stale report would misreport state
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
this.printSplitSummary(converted, regenReseed, needsHand, withUnhandled, flags['dry-run'], bakeCodegen);
|
|
291
|
+
const gapCount = needsHand.length + withUnhandled.length;
|
|
292
|
+
if (gapCount > 0 && !flags['allow-gaps']) {
|
|
293
|
+
// In bake mode the working DB pools are open; this.error → oclif force-exits anyway.
|
|
294
|
+
this.error(`${needsHand.length} migration(s) need hand-authoring and ${withUnhandled.length} have ` +
|
|
295
|
+
'unhandled statements. Resolve the gaps (conversion-gaps.report.json + comments in the ' +
|
|
296
|
+
'output files), or pass --allow-gaps to accept them for now.');
|
|
297
|
+
}
|
|
298
|
+
// setupDataSource() opened pg pools that keep the event loop alive, and CodeGenConnection
|
|
299
|
+
// exposes no close(). Mirror the `mj codegen` command (runCodeGen.ts) and exit explicitly so
|
|
300
|
+
// the CLI terminates after a clean bake.
|
|
301
|
+
if (bakeCodegen)
|
|
302
|
+
process.exit(0);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Construct the AST transpiler with the cross-file BIT/BOOLEAN column registry
|
|
306
|
+
* collected from the baselines (they declare the core tables, e.g. User.IsActive),
|
|
307
|
+
* so per-file transpiles can coerce 1/0 → TRUE/FALSE in seed INSERTs that target
|
|
308
|
+
* tables defined outside the migration being converted. Fails fast with install
|
|
309
|
+
* guidance when Python/sqlglot is unavailable.
|
|
310
|
+
*/
|
|
311
|
+
async buildTranspiler(sourceDir) {
|
|
312
|
+
const probe = new MJPostgresTranspiler();
|
|
313
|
+
try {
|
|
314
|
+
await probe.preflight();
|
|
315
|
+
}
|
|
316
|
+
catch (err) {
|
|
317
|
+
this.error(err instanceof Error ? err.message : String(err));
|
|
318
|
+
}
|
|
319
|
+
const baselines = fs
|
|
320
|
+
.readdirSync(sourceDir)
|
|
321
|
+
.filter((f) => /^B\d.*\.sql$/.test(f) && !f.endsWith('.pg.sql') && !f.endsWith('.pg-only.sql'))
|
|
322
|
+
.sort();
|
|
323
|
+
const bitColumns = [];
|
|
324
|
+
for (const b of baselines) {
|
|
325
|
+
try {
|
|
326
|
+
const cols = await probe.collectBitColumns(fs.readFileSync(path.join(sourceDir, b), 'utf8'));
|
|
327
|
+
bitColumns.push(...cols);
|
|
328
|
+
}
|
|
329
|
+
catch (err) {
|
|
330
|
+
// A baseline that fails bit-column collection degrades 1/0→TRUE/FALSE
|
|
331
|
+
// coercion for tables it declares — warn loudly, don't proceed silently.
|
|
332
|
+
this.warn(`Bit-column collection failed for ${b}: ${err instanceof Error ? err.message : String(err)}`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return new MJPostgresTranspiler({ extraBitColumns: bitColumns });
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Build the inline-baking driver: connect to the live working PG database (the same
|
|
339
|
+
* config/env `mj codegen` uses) and wire its apply / metadata-refresh / per-entity capture
|
|
340
|
+
* into an IncrementalBaker.
|
|
156
341
|
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
342
|
+
* The codegen engine + data-provider stack is heavy and only this opt-in path needs it, so
|
|
343
|
+
* the value graph is loaded with a dynamic import here (Rule 8 case 3 — bundle-size deferral;
|
|
344
|
+
* codegen-lib + core are declared MJCLI deps) to keep a plain `convert --split` light. The
|
|
345
|
+
* matching `import type` at the top is erased at runtime, so it does not defeat the deferral.
|
|
161
346
|
*/
|
|
162
|
-
|
|
347
|
+
async buildBaker(transpiler, schema) {
|
|
348
|
+
const { RunCodeGenBase, SQLCodeGenBase, initializeConfig, dbPlatform } = await import('@memberjunction/codegen-lib');
|
|
349
|
+
if (dbPlatform() !== 'postgresql') {
|
|
350
|
+
this.error('--bake-codegen requires DB_PLATFORM=postgresql with PG_* connection env (the working DB CodeGen objects are captured from).');
|
|
351
|
+
}
|
|
352
|
+
initializeConfig(process.cwd());
|
|
353
|
+
let ds;
|
|
354
|
+
try {
|
|
355
|
+
ds = await new RunCodeGenBase().setupDataSource();
|
|
356
|
+
}
|
|
357
|
+
catch (err) {
|
|
358
|
+
this.error(`--bake-codegen could not connect/load metadata from the working PG database: ${err instanceof Error ? err.message : String(err)}. ` +
|
|
359
|
+
'Seed the working DB to the baseline (its __mj views + metadata must exist) before baking.');
|
|
360
|
+
}
|
|
361
|
+
const sqlGen = new SQLCodeGenBase();
|
|
362
|
+
const db = {
|
|
363
|
+
apply: async (sql) => {
|
|
364
|
+
await ds.connection.query(sql);
|
|
365
|
+
},
|
|
366
|
+
refreshMetadata: async () => {
|
|
367
|
+
await ds.provider.Refresh();
|
|
368
|
+
},
|
|
369
|
+
captureEntity: async (name) => {
|
|
370
|
+
const entity = ds.provider.EntityByName(name);
|
|
371
|
+
if (!entity)
|
|
372
|
+
throw new Error(`--bake-codegen: entity not found in working-DB metadata: ${name}`);
|
|
373
|
+
const r = await sqlGen.generateSingleEntitySQLToSeparateFiles({
|
|
374
|
+
pool: ds.connection,
|
|
375
|
+
entity,
|
|
376
|
+
directory: os.tmpdir(), // inert — writeFiles is false
|
|
377
|
+
onlyPermissions: false,
|
|
378
|
+
writeFiles: false,
|
|
379
|
+
skipExecution: false, // execute → keep the working DB current for later migrations
|
|
380
|
+
});
|
|
381
|
+
return { sql: r.sql ?? '', permissionsSQL: r.permissionsSQL ?? '' };
|
|
382
|
+
},
|
|
383
|
+
};
|
|
384
|
+
return new IncrementalBaker({ transpiler, db, schema });
|
|
385
|
+
}
|
|
386
|
+
/** Print the split-and-regenerate run summary and the mandatory next steps. */
|
|
387
|
+
printSplitSummary(converted, regenReseed, needsHand, withUnhandled, dryRun, bakeCodegen = false) {
|
|
388
|
+
this.log(`\n=== Split-and-Regenerate Summary${bakeCodegen ? ' (inline CodeGen baking)' : ''} ===`);
|
|
389
|
+
this.log(` transpiled (DDL): ${converted.length}`);
|
|
390
|
+
const regenNote = bakeCodegen ? 'CodeGen baked inline; metadata via mj sync push' : 'handled by mj codegen + mj sync push';
|
|
391
|
+
this.log(` regen/reseed only: ${regenReseed.length} (${regenNote})`);
|
|
392
|
+
this.log(` needs hand-authoring: ${needsHand.length}`);
|
|
393
|
+
this.log(` with unhandled stmts: ${withUnhandled.length}`);
|
|
394
|
+
if (dryRun)
|
|
395
|
+
this.log(' (dry run — no files written)');
|
|
396
|
+
if (needsHand.length > 0) {
|
|
397
|
+
this.logToStderr('\n ⚠ Hand-written procedural SQL — written as .needs-hand files; finish and rename to .pg.sql:');
|
|
398
|
+
for (const h of needsHand)
|
|
399
|
+
this.logToStderr(` ${h.file} — ${h.routines.slice(0, 5).join(', ')}`);
|
|
400
|
+
}
|
|
401
|
+
if (withUnhandled.length > 0) {
|
|
402
|
+
this.logToStderr('\n ⚠ Statements the AST transpiler could not emit (embedded as comments in the output):');
|
|
403
|
+
for (const u of withUnhandled)
|
|
404
|
+
this.logToStderr(` ${u.file} — ${u.count} statement(s)`);
|
|
405
|
+
}
|
|
406
|
+
this.log('\nNext steps to complete the PG migration set (run against a fresh PG database):');
|
|
407
|
+
if (bakeCodegen) {
|
|
408
|
+
this.log(' 1. resolve any gaps above (hand-author or LLM last-mile, then rename .needs-hand)');
|
|
409
|
+
this.log(' 2. mj migrate # apply DDL + inline-baked CodeGen objects (no codegen step)');
|
|
410
|
+
this.log(' 3. mj sync push # re-seed mj-sync metadata');
|
|
411
|
+
this.log(' 4. schema/row-count diff vs a fresh SQL Server build to confirm parity');
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
this.log(' 1. resolve any gaps above (hand-author or LLM last-mile, then rename .needs-hand)');
|
|
415
|
+
this.log(' 2. mj migrate # apply the transpiled DDL (.pg.sql)');
|
|
416
|
+
this.log(' 3. mj codegen # regenerate CodeGen SQL objects natively (DB_PLATFORM=postgresql)');
|
|
417
|
+
this.log(' 4. mj sync push # re-seed mj-sync metadata');
|
|
418
|
+
this.log(' 5. schema/row-count diff vs a fresh SQL Server build to confirm parity');
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Discovers T-SQL migrations that don't have a corresponding PG counterpart.
|
|
423
|
+
*
|
|
424
|
+
* A T-SQL file like `V202604060452__v5.24.x__Foo.sql` maps to
|
|
425
|
+
* `V202604060452__v5.24.x__Foo.pg.sql` in the output directory; a `.pg-only.sql`
|
|
426
|
+
* variant also counts as a counterpart (manual PG-specific override). Counterpart
|
|
427
|
+
* presence is the only filter — baselines (B__) convert like any other file when
|
|
428
|
+
* their `.pg.sql` is missing (statement-mode classification handles them).
|
|
429
|
+
* `.needs-hand` artifacts are deliberately NOT counterparts: a migration stays
|
|
430
|
+
* unconverted until its gaps are resolved and the file is renamed to `.pg.sql`.
|
|
431
|
+
*/
|
|
432
|
+
discoverUnconverted(sourceDir, outputDir, specificFile) {
|
|
163
433
|
const sourceFiles = fs.readdirSync(sourceDir)
|
|
164
434
|
.filter((f) => f.endsWith('.sql') && !f.endsWith('.pg.sql') && !f.endsWith('.pg-only.sql'))
|
|
165
435
|
.sort();
|
|
436
|
+
if (specificFile && !sourceFiles.includes(specificFile)) {
|
|
437
|
+
this.error(`--file ${specificFile} not found in ${sourceDir}`);
|
|
438
|
+
}
|
|
166
439
|
const outputFiles = new Set(fs.readdirSync(outputDir)
|
|
167
440
|
.filter((f) => f.endsWith('.pg.sql') || f.endsWith('.pg-only.sql')));
|
|
168
441
|
const unconverted = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/commands/migrate/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAG7C;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,OAAO;aAC1C,gBAAW,GAAG,0EAA0E,CAAC;aAEzF,aAAQ,GAAG;QAChB,mCAAmC;QACnC,6CAA6C;QAC7C,mFAAmF;QACnF,gGAAgG;QAChG,6CAA6C;KAC9C,CAAC;aAEK,UAAK,GAAG;QACb,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC;YACzB,WAAW,EAAE,mCAAmC;YAChD,OAAO,EAAE,iBAAiB;SAC3B,CAAC;QACF,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC;YACzB,WAAW,EAAE,gCAAgC;YAC7C,OAAO,EAAE,oBAAoB;SAC9B,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,kEAAkE;SAChF,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,oBAAoB;YACjC,OAAO,EAAE,MAAM;SAChB,CAAC;QACF,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;YACvB,WAAW,EAAE,oDAAoD;YACjE,OAAO,EAAE,KAAK;SACf,CAAC;QACF,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC;YACzB,WAAW,EAAE,oDAAoD;YACjE,OAAO,EAAE,KAAK;SACf,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,6BAA6B;YAC1C,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAEnD,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACvC,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,+BAA+B,EAAE,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;QAEnJ,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QAEpD,2BAA2B;QAC3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,GAAG,CAAC,6BAA6B,SAAS,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,wBAAwB;QACxB,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACtD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC/D,CAAC;QAED,sBAAsB;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAEzF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,MAAM,6BAA6B,CAAC,CAAC;QACnE,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,UAAU,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEb,oBAAoB;QACpB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,UAAU,GAAoB,qBAAqB,EAAE,CAAC;QAE5D,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC,eAAe,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;YAEhD,MAAM,MAAM,GAAyB;gBACnC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC;gBAClD,YAAY,EAAE,IAAI;gBAClB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC;gBACtD,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,aAAa,EAAE,MAAM;gBACrB,aAAa,EAAE,UAAU;gBACzB,aAAa,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC;gBAClC,iBAAiB,EAAE,IAAI;gBACvB,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;aAC9E,CAAC;YAEF,MAAM,MAAM,GAAyB,WAAW,CAAC,MAAM,CAAC,CAAC;YACzD,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAE1C,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,UAAU,EAAE,CAAC;gBACb,IAAI,CAAC,WAAW,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,MAAM,OAAO,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;gBAChF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;oBAC5C,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,YAAY,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,SAAS,aAAa,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,WAAW,CAAC,CAAC;YACtH,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,kBAAkB,WAAW,CAAC,MAAM,KAAK,YAAY,QAAQ,UAAU,UAAU,CAAC,CAAC;QAC5F,IAAI,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,YAAY,WAAW,UAAU,CAAC,SAAS,eAAe,UAAU,CAAC,OAAO,aAAa,UAAU,CAAC,MAAM,SAAS,CAAC,CAAC;QAC3J,IAAI,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC;QAEzD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,uCAAuC,UAAU,UAAU,CAAC,CAAC;QAC1E,CAAC;QAED,wEAAwE;QACxE,+DAA+D;QAC/D,IAAI,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,+BAA+B,CAAC,SAAS,CAAC,CAAC;QAC/D,IAAI,WAAW,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC,WAAW,WAAW,CAAC,eAAe,iCAAiC,WAAW,CAAC,KAAK,CAAC,MAAM,aAAa,CAAC,CAAC;YACvH,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;gBACpC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,gBAAgB,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,0BAA0B,WAAW,CAAC,YAAY,gCAAgC,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACK,mBAAmB,CACzB,SAAiB,EACjB,SAAiB,EACjB,YAAgC,EAChC,EAA4B,EAC5B,IAAgC;QAEhC,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC;aAC1C,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;aAClG,IAAI,EAAE,CAAC;QAEV,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC;aACtB,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAC9E,CAAC;QAEF,MAAM,WAAW,GAAsD,EAAE,CAAC;QAE1E,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,0DAA0D;YAC1D,IAAI,YAAY,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;gBAChD,SAAS;YACX,CAAC;YAED,2DAA2D;YAC3D,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAE3D,qCAAqC;YACrC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjC,4EAA4E;gBAC5E,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;gBACpE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;oBACrC,WAAW,CAAC,IAAI,CAAC;wBACf,UAAU,EAAE,UAAU;wBACtB,UAAU,EAAE,UAAU;qBACvB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,UAAU,CAAC,MAAuB,EAAE,MAAuB;QACjE,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC;QAC3C,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;QACrC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;QACjC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;QAC/B,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC;QAC7C,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC;QAC3C,MAAM,CAAC,mBAAmB,IAAI,MAAM,CAAC,mBAAmB,CAAC;QACzD,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC,kBAAkB,CAAC;QACvD,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,iBAAiB,CAAC;QACrD,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,CAAC;QAC/C,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,CAAC;QACnD,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe,CAAC;QACjD,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC;QAC7C,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,CAAC;QACnD,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,iBAAiB,CAAC;QACrD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QACjD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IACvD,CAAC"}
|
|
1
|
+
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/commands/migrate/convert.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
/**
|
|
3
|
+
* Re-bake the post-baseline PG migration set with INLINE NATIVE CodeGen (Path C), so the set
|
|
4
|
+
* deploys with `mj migrate` alone — no `mj codegen` step.
|
|
5
|
+
*
|
|
6
|
+
* Unlike `convert --bake-codegen` (which bakes UNCONVERTED migrations forward), `rebake` re-bakes
|
|
7
|
+
* migrations that already have a committed `.pg.sql`: it advances a live working DB by applying
|
|
8
|
+
* each migration's known-good committed file in order (which keeps dependent views consistent and
|
|
9
|
+
* registers new entities), then captures native CodeGen read-only and writes the baked file. A
|
|
10
|
+
* migration with a transpile gap (unhandled statement / hand-procedural) keeps its committed file.
|
|
11
|
+
*
|
|
12
|
+
* Requires a LIVE working PG database (DB_PLATFORM=postgresql + PG_* env, as `mj codegen`) seeded
|
|
13
|
+
* to the latest baseline; the command brings it forward as it re-bakes.
|
|
14
|
+
*/
|
|
15
|
+
export default class MigrateRebake extends Command {
|
|
16
|
+
static description: string;
|
|
17
|
+
static examples: string[];
|
|
18
|
+
static flags: {
|
|
19
|
+
'source-dir': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
20
|
+
'output-dir': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
21
|
+
schema: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
22
|
+
'baseline-floor': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
23
|
+
'dry-run': import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
24
|
+
};
|
|
25
|
+
run(): Promise<void>;
|
|
26
|
+
/** Highest `B<version>__...` baseline in the output dir → its version key is the floor. */
|
|
27
|
+
private latestBaselineFloor;
|
|
28
|
+
/** SS V-migrations whose version key sorts strictly after the floor (committed order). */
|
|
29
|
+
private postBaselineMigrations;
|
|
30
|
+
/** Committed PG counterpart: `.pg.sql` preferred, else a hand-authored `.pg-only.sql`. */
|
|
31
|
+
private committedCounterpart;
|
|
32
|
+
/** AST transpiler with the cross-file BIT-column registry from the baselines (see convert.ts). */
|
|
33
|
+
private buildTranspiler;
|
|
34
|
+
/**
|
|
35
|
+
* Wire the working-DB capabilities to a live PG connection. The codegen engine is loaded with a
|
|
36
|
+
* dynamic import (Rule 8 case 3 — heavy module, opt-in path only); the matching `import type` is
|
|
37
|
+
* erased at runtime so it does not defeat the deferral.
|
|
38
|
+
*/
|
|
39
|
+
private buildBaker;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=rebake.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rebake.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/rebake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAU7C;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,OAAO;IAChD,MAAM,CAAC,WAAW,SAA2E;IAE7F,MAAM,CAAC,QAAQ,WAGb;IAEF,MAAM,CAAC,KAAK;;;;;;MAMV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAsE1B,2FAA2F;IAC3F,OAAO,CAAC,mBAAmB;IAM3B,0FAA0F;IAC1F,OAAO,CAAC,sBAAsB;IAU9B,0FAA0F;IAC1F,OAAO,CAAC,oBAAoB;IAO5B,kGAAkG;YACpF,eAAe;IAmB7B;;;;OAIG;YACW,UAAU;CA4CzB"}
|