@atlasauth/cli 0.7.0 → 0.9.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/CHANGELOG.md +36 -0
- package/dist/args.d.ts +155 -0
- package/dist/args.js +66 -1
- package/dist/args.js.map +1 -1
- package/dist/commands/auth.js +5 -1
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/config.d.ts +56 -1
- package/dist/commands/config.js +188 -29
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/csp.d.ts +32 -0
- package/dist/commands/csp.js +180 -0
- package/dist/commands/csp.js.map +1 -0
- package/dist/commands/import-better-auth.d.ts +3 -0
- package/dist/commands/import-better-auth.js +164 -0
- package/dist/commands/import-better-auth.js.map +1 -0
- package/dist/commands/import.js +7 -0
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/info.js +1 -1
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +26 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/integrations.d.ts +8 -0
- package/dist/commands/integrations.js +112 -0
- package/dist/commands/integrations.js.map +1 -0
- package/dist/commands/listen.d.ts +17 -0
- package/dist/commands/listen.js +223 -0
- package/dist/commands/listen.js.map +1 -0
- package/dist/commands/migrate.js +40 -1
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/move-origin.d.ts +11 -0
- package/dist/commands/move-origin.js +95 -0
- package/dist/commands/move-origin.js.map +1 -0
- package/dist/commands/operator.d.ts +26 -0
- package/dist/commands/operator.js +198 -0
- package/dist/commands/operator.js.map +1 -0
- package/dist/commands/project-commands.d.ts +12 -0
- package/dist/commands/project-commands.js +130 -30
- package/dist/commands/project-commands.js.map +1 -1
- package/dist/commands/referrals.d.ts +4 -4
- package/dist/commands/referrals.js +203 -33
- package/dist/commands/referrals.js.map +1 -1
- package/dist/commands/shared.d.ts +6 -0
- package/dist/commands/shared.js +10 -1
- package/dist/commands/shared.js.map +1 -1
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.js +77 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/webhooks.d.ts +29 -2
- package/dist/commands/webhooks.js +257 -24
- package/dist/commands/webhooks.js.map +1 -1
- package/dist/config.d.ts +14 -0
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +13 -0
- package/dist/context.js.map +1 -1
- package/dist/help.d.ts +1 -1
- package/dist/help.js +221 -17
- package/dist/help.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/migrate/better-auth/integration.d.ts +59 -0
- package/dist/migrate/better-auth/integration.js +81 -0
- package/dist/migrate/better-auth/integration.js.map +1 -0
- package/dist/migrate/better-auth/orchestrator.d.ts +43 -0
- package/dist/migrate/better-auth/orchestrator.js +525 -0
- package/dist/migrate/better-auth/orchestrator.js.map +1 -0
- package/dist/migrate/better-auth/output.d.ts +20 -0
- package/dist/migrate/better-auth/output.js +146 -0
- package/dist/migrate/better-auth/output.js.map +1 -0
- package/dist/migrate/better-auth/translate.d.ts +77 -0
- package/dist/migrate/better-auth/translate.js +1989 -0
- package/dist/migrate/better-auth/translate.js.map +1 -0
- package/dist/run.js +14 -0
- package/dist/run.js.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.STEPS = void 0;
|
|
4
|
+
exports.missingPlaceholders = missingPlaceholders;
|
|
5
|
+
exports.leafDiff = leafDiff;
|
|
6
|
+
exports.migrateBetterAuth = migrateBetterAuth;
|
|
7
|
+
const node_child_process_1 = require("node:child_process");
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = require("node:path");
|
|
10
|
+
const upgrade_1 = require("@atlasauth/upgrade");
|
|
11
|
+
const args_1 = require("../../args");
|
|
12
|
+
const errors_1 = require("../../errors");
|
|
13
|
+
const output_1 = require("../../output");
|
|
14
|
+
const project_1 = require("../../project");
|
|
15
|
+
const secrets_1 = require("../../secrets");
|
|
16
|
+
const serialize_1 = require("../../serialize");
|
|
17
|
+
const version_1 = require("../../version");
|
|
18
|
+
const config_1 = require("../../commands/config");
|
|
19
|
+
const shared_1 = require("../../commands/shared");
|
|
20
|
+
const integration_1 = require("./integration");
|
|
21
|
+
const output_2 = require("./output");
|
|
22
|
+
const translate_1 = require("./translate");
|
|
23
|
+
/**
|
|
24
|
+
* `atlas migrate better-auth [path]` — the whole Better Auth → Atlas program as
|
|
25
|
+
* one resumable run:
|
|
26
|
+
*
|
|
27
|
+
* preflight → translate → apply (review the diff, confirm, config push) →
|
|
28
|
+
* export (the exporter runs in the app) → import (dry run, confirm, apply) →
|
|
29
|
+
* bridge (no forced logout) → code (the codemod) → verify (checklist).
|
|
30
|
+
*
|
|
31
|
+
* Each finished step is checkpointed in the state file, so `--resume` carries
|
|
32
|
+
* on where a run stopped (a confirmation declined, an env var missing, the
|
|
33
|
+
* export not run yet). `--dry-run` walks every step without changing the
|
|
34
|
+
* instance or the code; `--yes` answers every confirmation.
|
|
35
|
+
*/
|
|
36
|
+
exports.STEPS = ['preflight', 'translate', 'apply', 'export', 'import', 'bridge', 'code', 'verify'];
|
|
37
|
+
const DAY_MS = 86_400_000;
|
|
38
|
+
class Migration {
|
|
39
|
+
ctx;
|
|
40
|
+
args;
|
|
41
|
+
project;
|
|
42
|
+
dir;
|
|
43
|
+
format;
|
|
44
|
+
statePath;
|
|
45
|
+
yes;
|
|
46
|
+
dryRun;
|
|
47
|
+
json;
|
|
48
|
+
entry;
|
|
49
|
+
skip;
|
|
50
|
+
state;
|
|
51
|
+
http;
|
|
52
|
+
translation;
|
|
53
|
+
env;
|
|
54
|
+
log = [];
|
|
55
|
+
constructor(ctx, args, projectArg) {
|
|
56
|
+
this.ctx = ctx;
|
|
57
|
+
this.args = args;
|
|
58
|
+
const v = args.values;
|
|
59
|
+
this.project = (0, node_path_1.resolve)(projectArg ?? process.cwd());
|
|
60
|
+
this.dir = (0, node_path_1.resolve)(this.project, (0, args_1.str)(v, 'dir') ?? 'atlas-migrate/config');
|
|
61
|
+
this.format = (0, config_1.resolveFormat)(v);
|
|
62
|
+
this.statePath = (0, node_path_1.resolve)(this.project, (0, args_1.str)(v, 'state-file') ?? 'atlas-migrate/state.json');
|
|
63
|
+
this.yes = v.yes === true;
|
|
64
|
+
this.dryRun = v['dry-run'] === true;
|
|
65
|
+
this.json = (0, shared_1.wantsJson)(v);
|
|
66
|
+
this.entry = (0, args_1.str)(v, 'entry');
|
|
67
|
+
this.skip = new Set((0, args_1.list)(v, 'skip'));
|
|
68
|
+
for (const s of this.skip) {
|
|
69
|
+
if (!exports.STEPS.includes(s))
|
|
70
|
+
throw new errors_1.CliError(`--skip: unknown step '${s}'. Steps: ${exports.STEPS.join(', ')}.`);
|
|
71
|
+
}
|
|
72
|
+
// Placeholder values: the app's own dotenv files, then the real environment (which wins).
|
|
73
|
+
this.env = { ...readDotenvs(this.project), ...ctx.env };
|
|
74
|
+
this.state = { version: 1, project: this.project, instance_id: null, environment: null, started_at: Date.now(), steps: {} };
|
|
75
|
+
}
|
|
76
|
+
say(line) {
|
|
77
|
+
this.log.push(line);
|
|
78
|
+
if (this.json)
|
|
79
|
+
this.ctx.io.err(line);
|
|
80
|
+
else
|
|
81
|
+
this.ctx.io.out(line);
|
|
82
|
+
}
|
|
83
|
+
api() {
|
|
84
|
+
if (!this.http) {
|
|
85
|
+
const auth = (0, shared_1.resolveAuth)(this.ctx, this.args.values);
|
|
86
|
+
this.http = (0, project_1.httpFor)(this.ctx, { secretKey: auth.secretKey, apiUrl: auth.apiUrl });
|
|
87
|
+
}
|
|
88
|
+
return this.http;
|
|
89
|
+
}
|
|
90
|
+
async confirm(question) {
|
|
91
|
+
if (this.yes)
|
|
92
|
+
return true;
|
|
93
|
+
if (this.json)
|
|
94
|
+
return false;
|
|
95
|
+
const answer = await this.ctx.prompt.text(`${question} [y/N]`);
|
|
96
|
+
return /^y(es)?$/i.test(answer.trim());
|
|
97
|
+
}
|
|
98
|
+
loadState() {
|
|
99
|
+
const resume = this.args.values.resume === true;
|
|
100
|
+
const force = this.args.values.force === true;
|
|
101
|
+
if (!(0, node_fs_1.existsSync)(this.statePath)) {
|
|
102
|
+
if (resume)
|
|
103
|
+
throw new errors_1.CliError(`Nothing to resume: ${this.statePath} does not exist. Run without --resume to start.`);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (force && !resume)
|
|
107
|
+
return; // start over; the file is replaced on the first checkpoint
|
|
108
|
+
if (!resume && !this.dryRun) {
|
|
109
|
+
throw new errors_1.CliError(`A migration is in progress (${this.statePath}). Pass --resume to continue it, or --force to start over.`);
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
this.state = JSON.parse((0, node_fs_1.readFileSync)(this.statePath, 'utf8'));
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
throw new errors_1.CliError(`${this.statePath} is not a valid state file. Delete it or pass --force.`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
saveState() {
|
|
119
|
+
if (this.dryRun)
|
|
120
|
+
return;
|
|
121
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(this.statePath), { recursive: true });
|
|
122
|
+
(0, node_fs_1.writeFileSync)(this.statePath, JSON.stringify(this.state, null, 2) + '\n');
|
|
123
|
+
}
|
|
124
|
+
/** The translation, from this run or (on resume) re-read from the report. */
|
|
125
|
+
getTranslation() {
|
|
126
|
+
if (this.translation)
|
|
127
|
+
return this.translation;
|
|
128
|
+
const analysis = (0, upgrade_1.analyzeBetterAuth)(this.project, this.entry ? { entry: this.entry } : {});
|
|
129
|
+
this.translation = (0, translate_1.translateBetterAuth)(analysis);
|
|
130
|
+
return this.translation;
|
|
131
|
+
}
|
|
132
|
+
async run() {
|
|
133
|
+
this.loadState();
|
|
134
|
+
let exitCode = 0;
|
|
135
|
+
for (const step of exports.STEPS) {
|
|
136
|
+
const prev = this.state.steps[step];
|
|
137
|
+
if (prev && (prev.status === 'done' || prev.status === 'skipped') && step !== 'verify') {
|
|
138
|
+
this.say(`[${step}] already ${prev.status}${prev.message ? `: ${prev.message}` : ''}`);
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (this.skip.has(step)) {
|
|
142
|
+
this.record(step, { status: 'skipped', message: 'skipped with --skip' });
|
|
143
|
+
this.say(`[${step}] skipped (--skip)`);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
this.say(`[${step}]`);
|
|
147
|
+
const result = await HANDLERS[step](this);
|
|
148
|
+
this.record(step, result);
|
|
149
|
+
if (result.message)
|
|
150
|
+
this.say(`[${step}] ${result.status}: ${result.message}`);
|
|
151
|
+
if (result.exitCode && result.exitCode > exitCode)
|
|
152
|
+
exitCode = result.exitCode;
|
|
153
|
+
if (result.stop)
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
if (this.json) {
|
|
157
|
+
(0, output_1.printJson)(this.ctx.io, {
|
|
158
|
+
object: 'better_auth_migration',
|
|
159
|
+
dry_run: this.dryRun,
|
|
160
|
+
project: this.project,
|
|
161
|
+
config_dir: this.dir,
|
|
162
|
+
state_file: this.dryRun ? null : this.statePath,
|
|
163
|
+
instance_id: this.state.instance_id,
|
|
164
|
+
steps: exports.STEPS.map((id) => ({ id, ...(this.state.steps[id] ?? { status: 'pending' }) })),
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return exitCode;
|
|
168
|
+
}
|
|
169
|
+
record(step, result) {
|
|
170
|
+
this.state.steps[step] = {
|
|
171
|
+
status: result.status,
|
|
172
|
+
at: Date.now(),
|
|
173
|
+
...(result.detail ? { detail: result.detail } : {}),
|
|
174
|
+
...(result.message ? { message: result.message } : {}),
|
|
175
|
+
};
|
|
176
|
+
this.saveState();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// ───────────────────────────── steps ─────────────────────────────
|
|
180
|
+
const HANDLERS = {
|
|
181
|
+
async preflight(m) {
|
|
182
|
+
const http = m.api();
|
|
183
|
+
const inst = await http.get('/v1/instance');
|
|
184
|
+
if (m.state.instance_id && inst.id && m.state.instance_id !== inst.id && m.args.values.force !== true) {
|
|
185
|
+
throw new errors_1.CliError(`This migration was started on instance ${m.state.instance_id}, but the key belongs to ${inst.id}. Use the same key, or --force to start over.`);
|
|
186
|
+
}
|
|
187
|
+
m.state.instance_id = inst.id ?? null;
|
|
188
|
+
m.state.environment = inst.environment ?? null;
|
|
189
|
+
const analysis = (0, upgrade_1.analyzeBetterAuth)(m.project, m.entry ? { entry: m.entry } : {});
|
|
190
|
+
const baVersion = analysis.dependencies['better-auth'] ?? null;
|
|
191
|
+
let pre = { errors: 0, warnings: 0 };
|
|
192
|
+
try {
|
|
193
|
+
const report = await http.get('/v1/instance/preflight');
|
|
194
|
+
const findings = report.findings ?? [];
|
|
195
|
+
pre = { errors: findings.filter((f) => f.severity === 'error').length, warnings: findings.filter((f) => f.severity === 'warning').length };
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
/* preflight is advisory here; verify runs it again */
|
|
199
|
+
}
|
|
200
|
+
m.say(` instance ${inst.id ?? '?'} (${inst.environment ?? 'unknown'}), CLI ${(0, version_1.getVersion)()}, better-auth ${baVersion ?? 'not in package.json'}`);
|
|
201
|
+
if (inst.environment === 'production')
|
|
202
|
+
m.say(' note: this is a production instance. Run the whole program on a development instance first.');
|
|
203
|
+
if (!analysis.instances.length) {
|
|
204
|
+
return { status: 'blocked', stop: true, exitCode: 1, message: `No betterAuth({...}) call found under ${m.project}. Pass the app folder, or --entry <file>.` };
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
status: 'done',
|
|
208
|
+
detail: { instance_id: inst.id, environment: inst.environment, frontend_api_host: inst.frontend_api_host ?? null, cli_version: (0, version_1.getVersion)(), better_auth: baVersion, preflight: pre },
|
|
209
|
+
message: `instance ${inst.id}; preflight ${pre.errors} error(s), ${pre.warnings} warning(s)`,
|
|
210
|
+
};
|
|
211
|
+
},
|
|
212
|
+
async translate(m) {
|
|
213
|
+
const t = m.getTranslation();
|
|
214
|
+
const written = (0, output_2.writeTranslation)(t, m.dir, m.format);
|
|
215
|
+
for (const line of (0, output_2.summaryLines)(t, m.dir, written))
|
|
216
|
+
m.say(` ${line}`);
|
|
217
|
+
return {
|
|
218
|
+
status: 'done',
|
|
219
|
+
detail: { files: written, mappings: t.mappings, bridge: t.bridge, env: t.env.map((e) => e.name), secrets: t.secrets },
|
|
220
|
+
message: `${written.length - 2} config file(s) in ${m.dir}; report ${(0, node_path_1.join)(m.dir, output_2.REPORT_MD)}`,
|
|
221
|
+
};
|
|
222
|
+
},
|
|
223
|
+
async apply(m) {
|
|
224
|
+
const http = m.api();
|
|
225
|
+
const ext = m.format === 'json' ? 'json' : 'yaml';
|
|
226
|
+
const instanceFile = (0, node_path_1.join)(m.dir, `instance.${ext}`);
|
|
227
|
+
if (!(0, node_fs_1.existsSync)(instanceFile))
|
|
228
|
+
return { status: 'blocked', stop: true, exitCode: 1, message: `${instanceFile} is missing; re-run with --force to translate again.` };
|
|
229
|
+
// Keep the origins already allowed on the instance: the translation only adds.
|
|
230
|
+
const live = await http.get('/v1/instance');
|
|
231
|
+
const desired = (0, serialize_1.deserialize)((0, node_fs_1.readFileSync)(instanceFile, 'utf8'), m.format);
|
|
232
|
+
const liveOrigins = Array.isArray(live.allowed_origins) ? live.allowed_origins : [];
|
|
233
|
+
const desiredOrigins = Array.isArray(desired.allowed_origins) ? desired.allowed_origins : [];
|
|
234
|
+
// Compare resolved values (an origin is usually a ${BETTER_AUTH_URL} placeholder);
|
|
235
|
+
// the file keeps the placeholder, the review shows what will be sent.
|
|
236
|
+
const resolvedOrigin = (o) => (0, config_1.interpolate)(o, m.env);
|
|
237
|
+
const addedRaw = desiredOrigins.filter((o, i) => {
|
|
238
|
+
const r = resolvedOrigin(o);
|
|
239
|
+
return !liveOrigins.includes(r) && desiredOrigins.findIndex((p) => resolvedOrigin(p) === r) === i;
|
|
240
|
+
});
|
|
241
|
+
const added = addedRaw.map(resolvedOrigin);
|
|
242
|
+
if (desired.allowed_origins !== undefined) {
|
|
243
|
+
desired.allowed_origins = [...liveOrigins, ...addedRaw];
|
|
244
|
+
if (!m.dryRun)
|
|
245
|
+
(0, node_fs_1.writeFileSync)(instanceFile, (0, serialize_1.serialize)(desired, m.format));
|
|
246
|
+
}
|
|
247
|
+
const missing = missingPlaceholders(m.dir, m.env);
|
|
248
|
+
const translateDetail = m.state.steps.translate?.detail;
|
|
249
|
+
const secrets = translateDetail?.secrets ?? m.getTranslation().secrets;
|
|
250
|
+
for (const s of secrets)
|
|
251
|
+
if (!m.env[s.env])
|
|
252
|
+
missing.add(s.env);
|
|
253
|
+
if (missing.size && !m.dryRun) {
|
|
254
|
+
return {
|
|
255
|
+
status: 'blocked',
|
|
256
|
+
stop: true,
|
|
257
|
+
exitCode: 1,
|
|
258
|
+
message: `Set ${[...missing].sort().join(', ')} (from your app's environment or a .env file in the project), then run again with --resume. Values are only sent to Atlas, never written to disk.`,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
// The review: a leaf diff of auth_config plus the resource plan.
|
|
262
|
+
const liveConfig = (live.auth_config_resolved ?? live.auth_config ?? {});
|
|
263
|
+
// Diff on resolved values, but print the placeholder where the file has one
|
|
264
|
+
// so a resolved secret never reaches the terminal.
|
|
265
|
+
const rawConfig = (desired.auth_config ?? {});
|
|
266
|
+
const diff = leafDiff((0, config_1.interpolate)(rawConfig, m.env), liveConfig);
|
|
267
|
+
const rawLeaves = new Map(leafDiff(rawConfig, null).map((d) => [d.path, d.to]));
|
|
268
|
+
m.say(' Review:');
|
|
269
|
+
for (const o of added)
|
|
270
|
+
m.say(` + allowed_origins ${o}`);
|
|
271
|
+
for (const d of diff)
|
|
272
|
+
m.say(` ~ auth_config.${d.path}: ${short(d.from)} -> ${short(rawLeaves.get(d.path) ?? d.to)}`);
|
|
273
|
+
const plan = await (0, config_1.planConfigImport)(http, { dir: m.dir, format: m.format, env: m.env, prune: false });
|
|
274
|
+
if (!diff.length && !added.length)
|
|
275
|
+
plan.changes = plan.changes.filter((c) => c.type !== 'instance');
|
|
276
|
+
if (m.json) {
|
|
277
|
+
for (const c of plan.changes)
|
|
278
|
+
m.say(` ${c.action} ${c.type}${c.key ? ` ${c.key}` : ''}`);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
(0, config_1.printPlan)(m.ctx, plan.changes, plan.unchanged, plan.skippedDeletes, { dryRun: m.dryRun, prune: false });
|
|
282
|
+
}
|
|
283
|
+
if (missing.size)
|
|
284
|
+
m.say(` (dry run) still to set before applying: ${[...missing].sort().join(', ')}`);
|
|
285
|
+
const detail = { changes: plan.changes.map(({ type, action, key }) => ({ type, action, key })), auth_config_changes: diff.length, origins_added: added };
|
|
286
|
+
if (m.dryRun)
|
|
287
|
+
return { status: 'planned', detail, message: `${plan.changes.length} change(s) would be applied` };
|
|
288
|
+
if (!plan.changes.length && !secrets.length)
|
|
289
|
+
return { status: 'done', detail, message: 'the instance already matches' };
|
|
290
|
+
if (!(await m.confirm(`Apply ${plan.changes.length} change(s) to instance ${m.state.instance_id ?? ''}?`))) {
|
|
291
|
+
return { status: 'awaiting_confirmation', stop: true, detail, message: 'not applied. Re-run with --resume (and --yes to skip the question).' };
|
|
292
|
+
}
|
|
293
|
+
for (const s of secrets) {
|
|
294
|
+
await http.put('/v1/instance/captcha_secret', { provider: s.provider, secret: m.env[s.env] });
|
|
295
|
+
}
|
|
296
|
+
for (const c of plan.changes)
|
|
297
|
+
await c.apply();
|
|
298
|
+
return { status: 'done', detail, message: `applied ${plan.changes.length} change(s)` };
|
|
299
|
+
},
|
|
300
|
+
async export(m) {
|
|
301
|
+
const bundle = (0, node_path_1.resolve)(m.project, (0, args_1.str)(m.args.values, 'bundle') ?? (0, node_path_1.join)('atlas-migrate', 'better-auth.bundle'));
|
|
302
|
+
if ((0, node_fs_1.existsSync)(bundle))
|
|
303
|
+
return { status: 'done', detail: { bundle }, message: `bundle ${bundle}` };
|
|
304
|
+
const key = m.dryRun ? '<import public key>' : await (0, integration_1.getImportPublicKey)(m.api());
|
|
305
|
+
const cmd = (0, integration_1.exporterCommand)({ out: bundle, publicKey: key });
|
|
306
|
+
if (m.dryRun)
|
|
307
|
+
return { status: 'planned', detail: { bundle, command: cmd.display }, message: `would run in the app: ${cmd.display}` };
|
|
308
|
+
if (m.args.values['run-export'] === true) {
|
|
309
|
+
m.say(` running in ${m.project}: ${cmd.display}`);
|
|
310
|
+
const code = await (m.ctx.exec ?? execInherit)(cmd.cmd, cmd.args, { cwd: m.project });
|
|
311
|
+
if (code === 0 && (0, node_fs_1.existsSync)(bundle))
|
|
312
|
+
return { status: 'done', detail: { bundle }, message: `bundle ${bundle}` };
|
|
313
|
+
return { status: 'action_needed', stop: true, exitCode: 1, detail: { bundle, command: cmd.display }, message: `the exporter exited ${code}. Fix it and run: ${cmd.display}; then --resume.` };
|
|
314
|
+
}
|
|
315
|
+
m.say(' Export your Better Auth data. In the app (where its database is reachable), run:');
|
|
316
|
+
m.say(` ${cmd.display}`);
|
|
317
|
+
m.say(' The bundle is sealed to this instance: only Atlas can open it. Then run this command again with --resume (or pass --run-export to let the CLI run it).');
|
|
318
|
+
return { status: 'action_needed', stop: true, detail: { bundle, command: cmd.display }, message: 'waiting for the export bundle' };
|
|
319
|
+
},
|
|
320
|
+
async import(m) {
|
|
321
|
+
const bundlePath = m.state.steps.export?.detail?.bundle ?? (0, node_path_1.resolve)(m.project, (0, args_1.str)(m.args.values, 'bundle') ?? (0, node_path_1.join)('atlas-migrate', 'better-auth.bundle'));
|
|
322
|
+
if (!(0, node_fs_1.existsSync)(bundlePath)) {
|
|
323
|
+
if (m.dryRun)
|
|
324
|
+
return { status: 'planned', message: 'would upload the export bundle, show its dry run, then import it' };
|
|
325
|
+
return { status: 'blocked', stop: true, exitCode: 1, message: `No bundle at ${bundlePath}; run the export step first.` };
|
|
326
|
+
}
|
|
327
|
+
if (m.dryRun)
|
|
328
|
+
return { status: 'planned', detail: { bundle: bundlePath }, message: 'would upload the export bundle, show its dry run, then import it' };
|
|
329
|
+
const http = m.api();
|
|
330
|
+
// A resumed run reuses the import it already uploaded (an apply resumes from its cursor).
|
|
331
|
+
const savedId = m.state.steps.import?.detail?.import_id;
|
|
332
|
+
let imp;
|
|
333
|
+
if (savedId) {
|
|
334
|
+
try {
|
|
335
|
+
imp = await (0, integration_1.getImport)(http, savedId);
|
|
336
|
+
if (imp.status === 'uploading')
|
|
337
|
+
imp = await (0, integration_1.finalizeImport)(http, imp.id);
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
imp = undefined;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
if (!imp || imp.status === 'invalid') {
|
|
344
|
+
const bundle = (0, node_fs_1.readFileSync)(bundlePath, 'utf8');
|
|
345
|
+
imp = await (0, integration_1.uploadBundle)(http, { bundle, onPart: (n, of) => { if (of > 1)
|
|
346
|
+
m.say(` uploaded part ${n}/${of}`); } });
|
|
347
|
+
}
|
|
348
|
+
imp = await waitFor(m, imp);
|
|
349
|
+
const detail = () => ({ import_id: imp.id, status: imp.status, total: imp.total, succeeded: imp.progress?.succeeded, failed: imp.progress?.failed });
|
|
350
|
+
if (imp.status === 'invalid') {
|
|
351
|
+
return { status: 'blocked', stop: true, exitCode: 1, detail: detail(), message: `Atlas could not read the bundle: ${imp.error?.message ?? 'invalid'} (${imp.error?.code ?? 'invalid'}). Export again and re-run with --resume.` };
|
|
352
|
+
}
|
|
353
|
+
if (imp.status === 'completed')
|
|
354
|
+
return { status: 'done', detail: detail(), message: describeJob(imp) };
|
|
355
|
+
if (imp.status === 'ready') {
|
|
356
|
+
m.say(` Dry run (import ${imp.id}):`);
|
|
357
|
+
for (const row of imp.report?.models ?? [])
|
|
358
|
+
m.say(` ${row.label}: ${row.found} found, ${row.will_create} new, ${row.will_update} existing, ${row.will_skip} skipped`);
|
|
359
|
+
for (const a of imp.report?.action_items ?? [])
|
|
360
|
+
m.say(` ${a.severity === 'required' ? 'REQUIRED' : a.severity === 'recommended' ? 'todo' : 'note'}: ${a.message} (${a.count})`);
|
|
361
|
+
}
|
|
362
|
+
const conflicts = imp.report?.conflicts_total ?? 0;
|
|
363
|
+
if (conflicts > 0) {
|
|
364
|
+
m.say(` conflicts with existing Atlas data: ${conflicts}`);
|
|
365
|
+
for (const c of imp.report?.conflicts.slice(0, 10) ?? [])
|
|
366
|
+
m.say(` [${c.resolution}] ${c.model} ${c.row_id ?? ''}: ${c.message}`);
|
|
367
|
+
if (m.args.values['confirm-conflicts'] !== true) {
|
|
368
|
+
return { status: 'action_needed', stop: true, detail: detail(), message: `the dry run found ${conflicts} conflict(s). Review them, then re-run with --resume --confirm-conflicts.` };
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
const resuming = imp.status === 'failed';
|
|
372
|
+
if (!(await m.confirm(resuming ? `Resume import ${imp.id} into instance ${m.state.instance_id ?? ''}?` : `Import into instance ${m.state.instance_id ?? ''}?`))) {
|
|
373
|
+
return { status: 'awaiting_confirmation', stop: true, detail: detail(), message: 'not imported. Re-run with --resume (and --yes).' };
|
|
374
|
+
}
|
|
375
|
+
imp = await waitFor(m, await (0, integration_1.applyImport)(http, imp.id, { confirmConflicts: conflicts > 0 }));
|
|
376
|
+
if (imp.status !== 'completed') {
|
|
377
|
+
return { status: 'blocked', stop: true, exitCode: 1, detail: detail(), message: `the import stopped (${imp.error?.message ?? imp.status}). Re-run with --resume to continue where it stopped.` };
|
|
378
|
+
}
|
|
379
|
+
const failed = imp.progress?.failed ?? 0;
|
|
380
|
+
return { status: 'done', detail: detail(), message: describeJob(imp), exitCode: failed ? 2 : 0 };
|
|
381
|
+
},
|
|
382
|
+
async bridge(m) {
|
|
383
|
+
const bridge = (m.state.steps.translate?.detail?.bridge ?? m.getTranslation().bridge);
|
|
384
|
+
const days = Number((0, args_1.str)(m.args.values, 'bridge-days') ?? 30);
|
|
385
|
+
if (!Number.isInteger(days) || days < 1 || days > 365)
|
|
386
|
+
throw new errors_1.CliError('--bridge-days must be a whole number from 1 to 365.');
|
|
387
|
+
const secretEnv = bridge.secretEnv ?? 'BETTER_AUTH_SECRET';
|
|
388
|
+
const secret = m.env[secretEnv] ?? m.env.AUTH_SECRET;
|
|
389
|
+
if (m.dryRun)
|
|
390
|
+
return { status: 'planned', message: `would accept Better Auth sessions (${bridge.sessionCookie}) for ${days} day(s)` };
|
|
391
|
+
if (!secret) {
|
|
392
|
+
return { status: 'action_needed', message: `set ${secretEnv} (your Better Auth secret) and run again with --resume to turn the session bridge on; until then users sign in once after the cutover.` };
|
|
393
|
+
}
|
|
394
|
+
if (secret.length < 16)
|
|
395
|
+
throw new errors_1.CliError(`${secretEnv} is shorter than 16 characters; the session bridge needs the Better Auth secret your app signs cookies with.`);
|
|
396
|
+
await (0, integration_1.enableSessionBridge)(m.api(), { cookiePrefix: bridge.cookiePrefix, endsAt: Date.now() + days * DAY_MS }, secret);
|
|
397
|
+
return { status: 'done', detail: { cookie: bridge.sessionCookie, days }, message: `Better Auth sessions become Atlas sessions for ${days} day(s)` };
|
|
398
|
+
},
|
|
399
|
+
async code(m) {
|
|
400
|
+
const preview = (0, upgrade_1.runMigration)(m.project, { from: 'better-auth', write: false });
|
|
401
|
+
for (const line of (0, upgrade_1.formatMigration)(preview, { written: false }))
|
|
402
|
+
m.say(` ${line}`);
|
|
403
|
+
const detail = { files_changed: preview.filesChanged, manual: preview.manual.length, packages: preview.packages };
|
|
404
|
+
if (m.dryRun)
|
|
405
|
+
return { status: 'planned', detail, message: `${preview.filesChanged} file(s) would be rewritten` };
|
|
406
|
+
if (!preview.filesChanged)
|
|
407
|
+
return { status: 'done', detail, message: 'no code left to rewrite' };
|
|
408
|
+
if (!(await m.confirm(`Rewrite ${preview.filesChanged} file(s) in ${m.project}? (commit your work first)`))) {
|
|
409
|
+
return { status: 'awaiting_confirmation', stop: true, detail, message: 'code not rewritten. Re-run with --resume (and --yes), or run atlas migrate code --from better-auth yourself.' };
|
|
410
|
+
}
|
|
411
|
+
const result = (0, upgrade_1.runMigration)(m.project, { from: 'better-auth', write: true });
|
|
412
|
+
return { status: 'done', detail: { ...detail, files_changed: result.filesChanged }, message: `rewrote ${result.filesChanged} file(s); ${result.manual.length} item(s) need a manual look` };
|
|
413
|
+
},
|
|
414
|
+
async verify(m) {
|
|
415
|
+
if (m.dryRun)
|
|
416
|
+
return { status: 'planned', message: 'would check counts, preflight and print the sign-in checklist' };
|
|
417
|
+
const http = m.api();
|
|
418
|
+
const lines = [];
|
|
419
|
+
const users = await countOf(http, '/v1/users?limit=1&include_total_count=true');
|
|
420
|
+
const orgs = await countOf(http, '/v1/organizations?limit=1&include_total_count=true');
|
|
421
|
+
const imported = m.state.steps.import?.detail;
|
|
422
|
+
lines.push(`users on the instance: ${users ?? 'unknown'}${imported?.total !== undefined ? ` (import: ${imported.succeeded ?? 0} of ${imported.total} rows landed)` : ''}`);
|
|
423
|
+
lines.push(`organizations: ${orgs ?? 'unknown'}`);
|
|
424
|
+
let errors = 0;
|
|
425
|
+
try {
|
|
426
|
+
const pre = await http.get('/v1/instance/preflight');
|
|
427
|
+
const findings = pre.findings ?? [];
|
|
428
|
+
errors = findings.filter((f) => f.severity === 'error').length;
|
|
429
|
+
lines.push(`preflight: ${errors} error(s), ${findings.filter((f) => f.severity === 'warning').length} warning(s)${errors ? ` (${findings.filter((f) => f.severity === 'error').map((f) => f.code).join(', ')}; run atlas preflight)` : ''}`);
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
lines.push('preflight: could not run (atlas preflight)');
|
|
433
|
+
}
|
|
434
|
+
const host = m.state.steps.preflight?.detail?.frontend_api_host ?? null;
|
|
435
|
+
const signIn = host ? `https://${host}/hosted/sign-in` : '(your Atlas sign-in page)';
|
|
436
|
+
const providers = Object.values((m.state.steps.translate?.detail?.mappings?.providers) ?? {});
|
|
437
|
+
lines.push('checklist:');
|
|
438
|
+
lines.push(` [ ] sign in as an imported password user at ${signIn}`);
|
|
439
|
+
for (const p of [...new Set(providers)])
|
|
440
|
+
lines.push(` [ ] sign in with ${p} at ${signIn} and check it lands on the imported user`);
|
|
441
|
+
lines.push(' [ ] open the app with an old Better Auth session cookie: it should become an Atlas session (bridge)');
|
|
442
|
+
lines.push(' [ ] check organizations, roles and metadata of a few imported users in the dashboard');
|
|
443
|
+
lines.push(` [ ] work through the manual items in ${(0, node_path_1.join)(m.dir, output_2.REPORT_MD)}`);
|
|
444
|
+
lines.push(' [ ] after the cutover window: re-run the export/import for late sign-ups, then turn Better Auth off');
|
|
445
|
+
for (const l of lines)
|
|
446
|
+
m.say(` ${l}`);
|
|
447
|
+
return { status: 'done', detail: { users, organizations: orgs, preflight_errors: errors, sign_in_url: signIn }, message: errors ? 'preflight reports errors' : 'checks passed', exitCode: errors ? 1 : 0 };
|
|
448
|
+
},
|
|
449
|
+
};
|
|
450
|
+
// ───────────────────────────── helpers ─────────────────────────────
|
|
451
|
+
async function waitFor(m, job) {
|
|
452
|
+
let current = job;
|
|
453
|
+
const sleep = m.ctx.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
454
|
+
while (!integration_1.RESTING_STATUSES.includes(current.status)) {
|
|
455
|
+
await sleep(2000);
|
|
456
|
+
current = await (0, integration_1.getImport)(m.api(), current.id);
|
|
457
|
+
}
|
|
458
|
+
return current;
|
|
459
|
+
}
|
|
460
|
+
function describeJob(job) {
|
|
461
|
+
const p = job.progress;
|
|
462
|
+
return `import ${job.id} ${job.status}: ${p?.succeeded ?? 0} of ${p?.total ?? job.total ?? 0} record(s) ok, ${p?.failed ?? 0} issue(s)`;
|
|
463
|
+
}
|
|
464
|
+
async function countOf(http, path) {
|
|
465
|
+
try {
|
|
466
|
+
const res = await http.get(path);
|
|
467
|
+
return typeof res.total_count === 'number' ? res.total_count : null;
|
|
468
|
+
}
|
|
469
|
+
catch {
|
|
470
|
+
return null;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
function execInherit(cmd, args, opts) {
|
|
474
|
+
return new Promise((resolveExit) => {
|
|
475
|
+
const child = (0, node_child_process_1.spawn)(cmd, args, { cwd: opts.cwd, stdio: 'inherit', shell: process.platform === 'win32' });
|
|
476
|
+
child.on('error', () => resolveExit(127));
|
|
477
|
+
child.on('exit', (code) => resolveExit(code ?? 1));
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
/** The project's .env files, lowest precedence first (values are only ever sent to Atlas). */
|
|
481
|
+
function readDotenvs(project) {
|
|
482
|
+
const out = {};
|
|
483
|
+
for (const name of ['.env', '.env.development', '.env.local', '.env.development.local']) {
|
|
484
|
+
Object.assign(out, (0, secrets_1.readEnvFile)((0, node_path_1.join)(project, name)) ?? {});
|
|
485
|
+
}
|
|
486
|
+
return out;
|
|
487
|
+
}
|
|
488
|
+
/** `${NAME}` placeholders in the config files that the environment does not set. */
|
|
489
|
+
function missingPlaceholders(dir, env) {
|
|
490
|
+
const missing = new Set();
|
|
491
|
+
if (!(0, node_fs_1.existsSync)(dir))
|
|
492
|
+
return missing;
|
|
493
|
+
for (const f of (0, node_fs_1.readdirSync)(dir)) {
|
|
494
|
+
if (!/\.(json|yaml)$/.test(f) || f.startsWith('better-auth-report'))
|
|
495
|
+
continue;
|
|
496
|
+
const text = (0, node_fs_1.readFileSync)((0, node_path_1.join)(dir, f), 'utf8');
|
|
497
|
+
for (const match of text.matchAll(/\$\{([A-Z0-9_]+)\}/g))
|
|
498
|
+
if (!env[match[1]])
|
|
499
|
+
missing.add(match[1]);
|
|
500
|
+
}
|
|
501
|
+
return missing;
|
|
502
|
+
}
|
|
503
|
+
/** Leaves of `desired` that differ from `live` (arrays compare as a whole). */
|
|
504
|
+
function leafDiff(desired, live, prefix = '') {
|
|
505
|
+
const out = [];
|
|
506
|
+
if (desired && typeof desired === 'object' && !Array.isArray(desired)) {
|
|
507
|
+
const liveObj = live && typeof live === 'object' && !Array.isArray(live) ? live : {};
|
|
508
|
+
for (const [k, v] of Object.entries(desired))
|
|
509
|
+
out.push(...leafDiff(v, liveObj[k], prefix ? `${prefix}.${k}` : k));
|
|
510
|
+
return out;
|
|
511
|
+
}
|
|
512
|
+
if (JSON.stringify(desired) !== JSON.stringify(live))
|
|
513
|
+
out.push({ path: prefix, from: live, to: desired });
|
|
514
|
+
return out;
|
|
515
|
+
}
|
|
516
|
+
function short(v) {
|
|
517
|
+
if (v === undefined)
|
|
518
|
+
return '(unset)';
|
|
519
|
+
const s = JSON.stringify(v);
|
|
520
|
+
return s.length > 60 ? `${s.slice(0, 57)}...` : s;
|
|
521
|
+
}
|
|
522
|
+
async function migrateBetterAuth(ctx, args, projectArg) {
|
|
523
|
+
return new Migration(ctx, args, projectArg).run();
|
|
524
|
+
}
|
|
525
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../../src/migrate/better-auth/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Format, type Json } from '../../serialize';
|
|
2
|
+
import type { ReportEntry, ReportStatus, Translation } from './translate';
|
|
3
|
+
/** The report files written next to the config documents (ignored by `atlas config import`). */
|
|
4
|
+
export declare const REPORT_MD = "better-auth-report.md";
|
|
5
|
+
export declare const REPORT_JSON = "better-auth-report.json";
|
|
6
|
+
/** Counts per status. */
|
|
7
|
+
export declare function reportCounts(report: ReportEntry[]): Record<ReportStatus, number>;
|
|
8
|
+
/** The resource files a translation produces: only the non-empty ones, plus the instance. */
|
|
9
|
+
export declare function documentFiles(t: Translation): Array<{
|
|
10
|
+
type: string;
|
|
11
|
+
value: Json;
|
|
12
|
+
}>;
|
|
13
|
+
/** Write the config documents and both reports into `dir`. Returns the file names written. */
|
|
14
|
+
export declare function writeTranslation(t: Translation, dir: string, format: Format): string[];
|
|
15
|
+
/** The machine-readable report (no values of secrets: only env var names). */
|
|
16
|
+
export declare function reportJson(t: Translation): Record<string, unknown>;
|
|
17
|
+
/** The human report, as Markdown. */
|
|
18
|
+
export declare function renderReport(t: Translation): string;
|
|
19
|
+
/** Short terminal summary lines. */
|
|
20
|
+
export declare function summaryLines(t: Translation, dir: string, written: string[]): string[];
|