@payload-auth-link/migrate 0.0.0-stage → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -2
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +257 -0
- package/dist/cli.js.map +1 -0
- package/dist/doctor/bands.d.ts +16 -0
- package/dist/doctor/bands.d.ts.map +1 -0
- package/dist/doctor/bands.js +49 -0
- package/dist/doctor/bands.js.map +1 -0
- package/dist/doctor/database.d.ts +3 -0
- package/dist/doctor/database.d.ts.map +1 -0
- package/dist/doctor/database.js +110 -0
- package/dist/doctor/database.js.map +1 -0
- package/dist/doctor/plugins.d.ts +12 -0
- package/dist/doctor/plugins.d.ts.map +1 -0
- package/dist/doctor/plugins.js +202 -0
- package/dist/doctor/plugins.js.map +1 -0
- package/dist/doctor/run-doctor.d.ts +48 -0
- package/dist/doctor/run-doctor.d.ts.map +1 -0
- package/dist/doctor/run-doctor.js +236 -0
- package/dist/doctor/run-doctor.js.map +1 -0
- package/dist/doctor/source-scan.d.ts +10 -0
- package/dist/doctor/source-scan.d.ts.map +1 -0
- package/dist/doctor/source-scan.js +142 -0
- package/dist/doctor/source-scan.js.map +1 -0
- package/dist/doctor/types.d.ts +86 -0
- package/dist/doctor/types.d.ts.map +1 -0
- package/dist/doctor/types.js +7 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/doctor/users.d.ts +10 -0
- package/dist/doctor/users.d.ts.map +1 -0
- package/dist/doctor/users.js +176 -0
- package/dist/doctor/users.js.map +1 -0
- package/dist/importer/apply.d.ts +39 -0
- package/dist/importer/apply.d.ts.map +1 -0
- package/dist/importer/apply.js +588 -0
- package/dist/importer/apply.js.map +1 -0
- package/dist/importer/lifecycle.d.ts +52 -0
- package/dist/importer/lifecycle.d.ts.map +1 -0
- package/dist/importer/lifecycle.js +265 -0
- package/dist/importer/lifecycle.js.map +1 -0
- package/dist/importer/run-import.d.ts +40 -0
- package/dist/importer/run-import.d.ts.map +1 -0
- package/dist/importer/run-import.js +176 -0
- package/dist/importer/run-import.js.map +1 -0
- package/dist/importer/source.d.ts +49 -0
- package/dist/importer/source.d.ts.map +1 -0
- package/dist/importer/source.js +147 -0
- package/dist/importer/source.js.map +1 -0
- package/dist/importer/types.d.ts +69 -0
- package/dist/importer/types.d.ts.map +1 -0
- package/dist/importer/types.js +13 -0
- package/dist/importer/types.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/package.json +70 -4
- package/src/cli.ts +287 -0
- package/src/doctor/bands.ts +66 -0
- package/src/doctor/database.ts +130 -0
- package/src/doctor/plugins.ts +216 -0
- package/src/doctor/run-doctor.ts +278 -0
- package/src/doctor/source-scan.ts +148 -0
- package/src/doctor/types.ts +92 -0
- package/src/doctor/users.ts +207 -0
- package/src/importer/apply.ts +731 -0
- package/src/importer/lifecycle.ts +328 -0
- package/src/importer/run-import.ts +237 -0
- package/src/importer/source.ts +211 -0
- package/src/importer/types.ts +96 -0
- package/src/index.ts +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/importer/lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD;;;;;GAKG;AAEH,eAAO,MAAM,mBAAmB,qCAAqC,CAAA;AAErE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAahE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1E;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAA;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;KAAE,EAAE,CAAA;CAChF,CAAA;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAA;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAA;CAC9D,GAAG,OAAO,CAAC,YAAY,CAAC,CA0NxB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACzC,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAiCjD;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,CAOvF"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
/**
|
|
3
|
+
* Manifest lifecycle (issue #50): `verify` checks both sides, `rollback`
|
|
4
|
+
* undoes exactly what the manifest records, and `finalize` marks the
|
|
5
|
+
* manifest so the source tables may be dropped — by the operator, as a
|
|
6
|
+
* separate later step.
|
|
7
|
+
*/
|
|
8
|
+
export const defaultManifestPath = 'payload-auth-link-migration.json';
|
|
9
|
+
export function readManifest(path) {
|
|
10
|
+
if (!existsSync(path)) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
14
|
+
if (typeof parsed !== 'object' ||
|
|
15
|
+
parsed === null ||
|
|
16
|
+
parsed.version !== 1) {
|
|
17
|
+
throw new Error(`manifest at ${path} is not a version-1 import manifest`);
|
|
18
|
+
}
|
|
19
|
+
return parsed;
|
|
20
|
+
}
|
|
21
|
+
export function writeManifest(manifest, path) {
|
|
22
|
+
writeFileSync(path, `${JSON.stringify(manifest, null, 2)}\n`);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Verify (issue #50): per-model counts match, every source user has
|
|
26
|
+
* exactly one target row, every credential account resolves to its
|
|
27
|
+
* user, every API key carries its hash with a resolvable owner, and
|
|
28
|
+
* every member/invitation references an existing org and user. Exits
|
|
29
|
+
* non-zero on any mismatch (the caller maps `ok` to the exit code).
|
|
30
|
+
*/
|
|
31
|
+
export async function verifyImport(options) {
|
|
32
|
+
const { payload, sourceConnectionString } = options;
|
|
33
|
+
const slugs = {
|
|
34
|
+
...{
|
|
35
|
+
user: 'ba-users',
|
|
36
|
+
account: 'ba-accounts',
|
|
37
|
+
session: 'ba-sessions',
|
|
38
|
+
apikey: 'ba-apikey',
|
|
39
|
+
organization: 'ba-organization',
|
|
40
|
+
member: 'ba-member',
|
|
41
|
+
invitation: 'ba-invitation',
|
|
42
|
+
},
|
|
43
|
+
...(options.slugs ?? {}),
|
|
44
|
+
};
|
|
45
|
+
const issues = [];
|
|
46
|
+
const checks = [];
|
|
47
|
+
const check = (name, passed, detail) => {
|
|
48
|
+
checks.push({ name, passed });
|
|
49
|
+
if (!passed && detail !== undefined) {
|
|
50
|
+
issues.push({ code: 'verify-mismatch', detail });
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const targetCounts = async (collection) => {
|
|
54
|
+
const counted = await payload.count({ collection, overrideAccess: true });
|
|
55
|
+
return counted.totalDocs;
|
|
56
|
+
};
|
|
57
|
+
// Source side, read directly.
|
|
58
|
+
const { openSource, readSourceUsers, countTables } = await import('./source.js');
|
|
59
|
+
const client = await openSource(sourceConnectionString);
|
|
60
|
+
try {
|
|
61
|
+
const sourceCounts = await countTables(client, [
|
|
62
|
+
'users',
|
|
63
|
+
'accounts',
|
|
64
|
+
'sessions',
|
|
65
|
+
'verifications',
|
|
66
|
+
'api_keys',
|
|
67
|
+
'jwks',
|
|
68
|
+
'organizations',
|
|
69
|
+
'members',
|
|
70
|
+
'invitations',
|
|
71
|
+
]);
|
|
72
|
+
const users = await readSourceUsers(client);
|
|
73
|
+
// 1. per-model counts match (sessions only when carried).
|
|
74
|
+
const countPairs = [
|
|
75
|
+
['users', String(slugs['user']), sourceCounts['users'] ?? 0],
|
|
76
|
+
['accounts', String(slugs['account']), sourceCounts['accounts'] ?? 0],
|
|
77
|
+
['api keys', String(slugs['apikey']), sourceCounts['api_keys'] ?? 0],
|
|
78
|
+
['organizations', String(slugs['organization']), sourceCounts['organizations'] ?? 0],
|
|
79
|
+
['members', String(slugs['member']), sourceCounts['members'] ?? 0],
|
|
80
|
+
['invitations', String(slugs['invitation']), sourceCounts['invitations'] ?? 0],
|
|
81
|
+
];
|
|
82
|
+
for (const [label, collection, expected] of countPairs) {
|
|
83
|
+
if (expected === 0) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const actual = await targetCounts(collection);
|
|
87
|
+
check(`count ${label}`, actual >= expected, `expected >= ${expected} ${label} in ${collection}, found ${actual}`);
|
|
88
|
+
}
|
|
89
|
+
// 2. every source user has exactly one target row and its host doc.
|
|
90
|
+
let userMatches = 0;
|
|
91
|
+
let userIssues = 0;
|
|
92
|
+
for (const user of users) {
|
|
93
|
+
const found = await payload.find({
|
|
94
|
+
collection: String(slugs['user']),
|
|
95
|
+
where: { baId: { equals: user.id } },
|
|
96
|
+
limit: 2,
|
|
97
|
+
depth: 0,
|
|
98
|
+
pagination: false,
|
|
99
|
+
overrideAccess: true,
|
|
100
|
+
});
|
|
101
|
+
if (found.totalDocs !== 1) {
|
|
102
|
+
userIssues += 1;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
userMatches += 1;
|
|
106
|
+
}
|
|
107
|
+
check('each source user has exactly one target row', userIssues === 0, `${userIssues} user(s) without exactly one ${String(slugs['user'])} row`);
|
|
108
|
+
void userMatches;
|
|
109
|
+
// 3. every credential account resolves to its user.
|
|
110
|
+
const accounts = await payload.find({
|
|
111
|
+
collection: String(slugs['account']),
|
|
112
|
+
limit: 1000,
|
|
113
|
+
depth: 0,
|
|
114
|
+
pagination: false,
|
|
115
|
+
overrideAccess: true,
|
|
116
|
+
});
|
|
117
|
+
const baUserIds = new Set();
|
|
118
|
+
const baUsers = await payload.find({
|
|
119
|
+
collection: String(slugs['user']),
|
|
120
|
+
limit: 1000,
|
|
121
|
+
depth: 0,
|
|
122
|
+
pagination: false,
|
|
123
|
+
overrideAccess: true,
|
|
124
|
+
});
|
|
125
|
+
for (const doc of baUsers.docs) {
|
|
126
|
+
baUserIds.add(String(doc.baId));
|
|
127
|
+
}
|
|
128
|
+
let orphanAccounts = 0;
|
|
129
|
+
let credentialAccounts = 0;
|
|
130
|
+
for (const doc of accounts.docs) {
|
|
131
|
+
const record = doc;
|
|
132
|
+
if (!baUserIds.has(String(record.userId))) {
|
|
133
|
+
orphanAccounts += 1;
|
|
134
|
+
}
|
|
135
|
+
if (record.providerId === 'credential') {
|
|
136
|
+
credentialAccounts += 1;
|
|
137
|
+
if (typeof record.password !== 'string' || record.password === '') {
|
|
138
|
+
orphanAccounts += 1;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
check('every account resolves to its user (credential hashes intact)', orphanAccounts === 0, `${orphanAccounts} account(s) with a missing user or empty credential hash`);
|
|
143
|
+
check('credential accounts carry hashes', sourceCounts.accounts === 0 || credentialAccounts > 0, 'no credential account carries a password hash');
|
|
144
|
+
// 4. API keys: hash present, owner resolves, rate-limit state kept.
|
|
145
|
+
const keys = await payload.find({
|
|
146
|
+
collection: String(slugs['apikey']),
|
|
147
|
+
limit: 1000,
|
|
148
|
+
depth: 0,
|
|
149
|
+
pagination: false,
|
|
150
|
+
overrideAccess: true,
|
|
151
|
+
});
|
|
152
|
+
let brokenKeys = 0;
|
|
153
|
+
for (const doc of keys.docs) {
|
|
154
|
+
const record = doc;
|
|
155
|
+
if (typeof record.key !== 'string' || record.key === '') {
|
|
156
|
+
brokenKeys += 1;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
// The satellite's user reference is `referenceId` on BA 1.7's own
|
|
160
|
+
// schema and `userId` in 1.6-era layouts.
|
|
161
|
+
const owner = record.referenceId ?? record.userId;
|
|
162
|
+
if (!baUserIds.has(String(owner))) {
|
|
163
|
+
brokenKeys += 1;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
check('every API key carries its hash and resolves to a user', brokenKeys === 0, `${brokenKeys} API key(s) without a hash or user`);
|
|
167
|
+
// 5. members/invitations reference existing orgs and users.
|
|
168
|
+
const orgIds = new Set();
|
|
169
|
+
const orgs = await payload.find({
|
|
170
|
+
collection: String(slugs['organization']),
|
|
171
|
+
limit: 1000,
|
|
172
|
+
depth: 0,
|
|
173
|
+
pagination: false,
|
|
174
|
+
overrideAccess: true,
|
|
175
|
+
});
|
|
176
|
+
for (const doc of orgs.docs) {
|
|
177
|
+
orgIds.add(String(doc.baId));
|
|
178
|
+
}
|
|
179
|
+
const members = await payload.find({
|
|
180
|
+
collection: String(slugs['member']),
|
|
181
|
+
limit: 1000,
|
|
182
|
+
depth: 0,
|
|
183
|
+
pagination: false,
|
|
184
|
+
overrideAccess: true,
|
|
185
|
+
});
|
|
186
|
+
let brokenMembers = 0;
|
|
187
|
+
for (const doc of members.docs) {
|
|
188
|
+
const record = doc;
|
|
189
|
+
if (!orgIds.has(String(record.organizationId)) || !baUserIds.has(String(record.userId))) {
|
|
190
|
+
brokenMembers += 1;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
check('every member references an existing org and user', brokenMembers === 0, `${brokenMembers} member(s) with dangling references`);
|
|
194
|
+
const invitations = await payload.find({
|
|
195
|
+
collection: String(slugs['invitation']),
|
|
196
|
+
limit: 1000,
|
|
197
|
+
depth: 0,
|
|
198
|
+
pagination: false,
|
|
199
|
+
overrideAccess: true,
|
|
200
|
+
});
|
|
201
|
+
let brokenInvitations = 0;
|
|
202
|
+
for (const doc of invitations.docs) {
|
|
203
|
+
const record = doc;
|
|
204
|
+
if (!orgIds.has(String(record.organizationId))) {
|
|
205
|
+
brokenInvitations += 1;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
check('every invitation references an existing org', brokenInvitations === 0, `${brokenInvitations} invitation(s) with dangling references`);
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
await client.end();
|
|
212
|
+
}
|
|
213
|
+
return { ok: issues.length === 0, issues, checks };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Rollback (issue #50): delete the created rows in reverse order and
|
|
217
|
+
* restore every captured field value. The manifest records exactly
|
|
218
|
+
* what to undo — nothing else is touched, and the source tables were
|
|
219
|
+
* never modified.
|
|
220
|
+
*/
|
|
221
|
+
export async function rollbackImport(options) {
|
|
222
|
+
const { payload, manifest, log = () => { } } = options;
|
|
223
|
+
if (manifest.finalized) {
|
|
224
|
+
// The point of no return: after `finalize`, the manifest's rows are
|
|
225
|
+
// the migration's history, not a TODO to undo.
|
|
226
|
+
throw new Error('the migration is finalized; rollback is no longer possible');
|
|
227
|
+
}
|
|
228
|
+
let deleted = 0;
|
|
229
|
+
for (const row of [...manifest.created].reverse()) {
|
|
230
|
+
try {
|
|
231
|
+
await payload.delete({ collection: row.collection, id: row.id, overrideAccess: true });
|
|
232
|
+
deleted += 1;
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
// Already gone (a crash after delete, a manual cleanup) — the
|
|
236
|
+
// goal state is "row absent", so absence is success.
|
|
237
|
+
log(`rollback: ${row.collection}#${row.id} already absent`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
let restored = 0;
|
|
241
|
+
for (const write of manifest.fieldWrites) {
|
|
242
|
+
const data = {
|
|
243
|
+
[write.field]: write.before === null ? null : JSON.parse(write.before),
|
|
244
|
+
};
|
|
245
|
+
await payload.update({
|
|
246
|
+
collection: write.collection,
|
|
247
|
+
id: write.id,
|
|
248
|
+
data,
|
|
249
|
+
overrideAccess: true,
|
|
250
|
+
});
|
|
251
|
+
restored += 1;
|
|
252
|
+
}
|
|
253
|
+
log(`rollback: ${deleted} row(s) deleted, ${restored} field value(s) restored`);
|
|
254
|
+
return { deleted, restored };
|
|
255
|
+
}
|
|
256
|
+
/** Finalize (issue #50): the point of no return — mark the manifest. */
|
|
257
|
+
export function finalizeManifest(manifest, path) {
|
|
258
|
+
if (manifest.finalized) {
|
|
259
|
+
return manifest;
|
|
260
|
+
}
|
|
261
|
+
const finalized = { ...manifest, finalized: true };
|
|
262
|
+
writeManifest(finalized, path);
|
|
263
|
+
return finalized;
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/importer/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type VerifyResult } from './lifecycle.js';
|
|
2
|
+
import { type ImportManifest, type ImportPlan, type ImportResult } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* The import commands (issue #50): `from-payload-auth` (dry-run by
|
|
5
|
+
* default, `--apply` writes), `verify`, `rollback`, `finalize`.
|
|
6
|
+
*
|
|
7
|
+
* Dry run prints planned row counts per model, collisions, and
|
|
8
|
+
* anything unmappable; unmappable data aborts `--apply` before any
|
|
9
|
+
* write. The manifest records every created row and field change;
|
|
10
|
+
* source tables are never modified — `finalize` only marks the
|
|
11
|
+
* manifest, and dropping them stays the operator's later step.
|
|
12
|
+
*/
|
|
13
|
+
export type ImportCommandOptions = {
|
|
14
|
+
readonly configPath: string;
|
|
15
|
+
readonly databaseUrl: string;
|
|
16
|
+
readonly apply: boolean;
|
|
17
|
+
readonly sessions: 'carry' | 'drop';
|
|
18
|
+
readonly manifestPath?: string | undefined;
|
|
19
|
+
readonly slugsJson?: string | undefined;
|
|
20
|
+
readonly json?: boolean;
|
|
21
|
+
readonly log?: (message: string) => void;
|
|
22
|
+
readonly loadPayload?: (configPath: string) => Promise<import('payload').Payload>;
|
|
23
|
+
};
|
|
24
|
+
/** The `from-payload-auth` command: dry-run plan, or `--apply` + manifest. */
|
|
25
|
+
export declare function runFromPayloadAuth(options: ImportCommandOptions): Promise<{
|
|
26
|
+
exitCode: number;
|
|
27
|
+
result?: ImportResult;
|
|
28
|
+
plan: ImportPlan;
|
|
29
|
+
unverified: readonly string[];
|
|
30
|
+
}>;
|
|
31
|
+
/** The `verify` command. */
|
|
32
|
+
export declare function runVerify(options: ImportCommandOptions): Promise<VerifyResult>;
|
|
33
|
+
/** The `rollback` command. */
|
|
34
|
+
export declare function runRollback(options: ImportCommandOptions): Promise<{
|
|
35
|
+
deleted: number;
|
|
36
|
+
restored: number;
|
|
37
|
+
}>;
|
|
38
|
+
/** The `finalize` command. */
|
|
39
|
+
export declare function runFinalize(options: ImportCommandOptions): Promise<ImportManifest>;
|
|
40
|
+
//# sourceMappingURL=run-import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-import.d.ts","sourceRoot":"","sources":["../../src/importer/run-import.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,YAAY,EAElB,MAAM,YAAY,CAAA;AAEnB;;;;;;;;;GASG;AAEH,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAA;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,SAAS,EAAE,OAAO,CAAC,CAAA;CAClF,CAAA;AA8DD,8EAA8E;AAC9E,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAC/E,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;CAC9B,CAAC,CA0ED;AAED,4BAA4B;AAC5B,wBAAsB,SAAS,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiBpF;AAED,8BAA8B;AAC9B,wBAAsB,WAAW,CAC/B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAahD;AAED,8BAA8B;AAC9B,wBAAgB,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAYlF"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { isRecord } from '@payload-auth-link/core';
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
|
+
import { applyImport, summarizePlanRows } from './apply.js';
|
|
4
|
+
import { defaultManifestPath, finalizeManifest, readManifest, rollbackImport, verifyImport, } from './lifecycle.js';
|
|
5
|
+
import { countTables, findOrphans, openSource, unverifiedEmails } from './source.js';
|
|
6
|
+
import { defaultTargetSlugs, } from './types.js';
|
|
7
|
+
const log_ = (options) => options.log ?? (() => { });
|
|
8
|
+
async function loadPayloadInstance(configPath) {
|
|
9
|
+
// Lazy: `doctor` never needs Payload, and a cold CLI should not pay
|
|
10
|
+
// for the module graph the import commands use.
|
|
11
|
+
const { getPayload } = await import('payload');
|
|
12
|
+
const mod = (await import(pathToFileURL(configPath).href));
|
|
13
|
+
let config = isRecord(mod) && 'default' in mod ? mod.default : mod;
|
|
14
|
+
if (typeof config?.then === 'function') {
|
|
15
|
+
config = await config;
|
|
16
|
+
}
|
|
17
|
+
return getPayload({ config: config });
|
|
18
|
+
}
|
|
19
|
+
function slugsOf(options) {
|
|
20
|
+
if (options.slugsJson === undefined) {
|
|
21
|
+
return { ...defaultTargetSlugs };
|
|
22
|
+
}
|
|
23
|
+
const parsed = JSON.parse(options.slugsJson);
|
|
24
|
+
if (!isRecord(parsed)) {
|
|
25
|
+
throw new Error('--slugs must be a JSON object of model -> collection slug');
|
|
26
|
+
}
|
|
27
|
+
return { ...defaultTargetSlugs, ...parsed };
|
|
28
|
+
}
|
|
29
|
+
/** Plan-only pass: counts, orphans, unverified users, warnings. */
|
|
30
|
+
async function buildPlan(options) {
|
|
31
|
+
const client = await openSource(options.databaseUrl);
|
|
32
|
+
try {
|
|
33
|
+
const sourceCounts = await countTables(client, [
|
|
34
|
+
'users',
|
|
35
|
+
'accounts',
|
|
36
|
+
'sessions',
|
|
37
|
+
'verifications',
|
|
38
|
+
'api_keys',
|
|
39
|
+
'jwks',
|
|
40
|
+
'organizations',
|
|
41
|
+
'members',
|
|
42
|
+
'invitations',
|
|
43
|
+
'users_role',
|
|
44
|
+
]);
|
|
45
|
+
const orphans = await findOrphans(client);
|
|
46
|
+
return {
|
|
47
|
+
sourceCounts,
|
|
48
|
+
plan: {
|
|
49
|
+
rows: [],
|
|
50
|
+
unmappable: orphans,
|
|
51
|
+
sessions: options.sessions,
|
|
52
|
+
warnings: [],
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
await client.end();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** The `from-payload-auth` command: dry-run plan, or `--apply` + manifest. */
|
|
61
|
+
export async function runFromPayloadAuth(options) {
|
|
62
|
+
const log = log_(options);
|
|
63
|
+
const slugs = slugsOf(options);
|
|
64
|
+
const { plan: basePlan, sourceCounts } = await buildPlan(options);
|
|
65
|
+
const unverified = await (async () => {
|
|
66
|
+
const client = await openSource(options.databaseUrl);
|
|
67
|
+
try {
|
|
68
|
+
const { readSourceUsers } = await import('./source.js');
|
|
69
|
+
return unverifiedEmails(await readSourceUsers(client));
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
await client.end();
|
|
73
|
+
}
|
|
74
|
+
})();
|
|
75
|
+
if (basePlan.unmappable.length > 0) {
|
|
76
|
+
// Unmappable data aborts the run — nothing is silently skipped.
|
|
77
|
+
const plan = {
|
|
78
|
+
...basePlan,
|
|
79
|
+
warnings: [
|
|
80
|
+
...basePlan.warnings,
|
|
81
|
+
`${unverified.length} unverified user(s) will NOT be granted the linkable proof`,
|
|
82
|
+
],
|
|
83
|
+
};
|
|
84
|
+
if (options.apply) {
|
|
85
|
+
log('ABORT: unmappable rows present; nothing was written');
|
|
86
|
+
return { exitCode: 1, plan, unverified };
|
|
87
|
+
}
|
|
88
|
+
return { exitCode: 1, plan, unverified };
|
|
89
|
+
}
|
|
90
|
+
const manifestPath = options.manifestPath ?? defaultManifestPath;
|
|
91
|
+
const existingManifest = readManifest(manifestPath);
|
|
92
|
+
const payload = await (options.loadPayload ?? loadPayloadInstance)(options.configPath);
|
|
93
|
+
const result = await applyImport({
|
|
94
|
+
payload,
|
|
95
|
+
sourceConnectionString: options.databaseUrl,
|
|
96
|
+
apply: options.apply,
|
|
97
|
+
sessions: options.sessions,
|
|
98
|
+
manifest: existingManifest,
|
|
99
|
+
manifestPath,
|
|
100
|
+
sourceCounts,
|
|
101
|
+
sourceDatabase: options.databaseUrl.replace(/\/\/[^@]*@/, '//***@'),
|
|
102
|
+
slugs,
|
|
103
|
+
log,
|
|
104
|
+
});
|
|
105
|
+
const plan = {
|
|
106
|
+
...result.plan,
|
|
107
|
+
warnings: [
|
|
108
|
+
...result.plan.warnings,
|
|
109
|
+
`${unverified.length} unverified user(s) will NOT be granted the linkable proof`,
|
|
110
|
+
],
|
|
111
|
+
};
|
|
112
|
+
if (!options.json) {
|
|
113
|
+
for (const row of summarizePlanRows(result.plan.rows)) {
|
|
114
|
+
log(` ${row.model.padEnd(14)} ${String(row.rows).padStart(5)} row(s) -> ${row.targetCollection}${row.skipped > 0 ? ` (${row.skipped} already present)` : ''}`);
|
|
115
|
+
}
|
|
116
|
+
for (const warning of plan.warnings) {
|
|
117
|
+
log(` ! ${warning}`);
|
|
118
|
+
}
|
|
119
|
+
for (const row of plan.unmappable) {
|
|
120
|
+
log(` X ${row.model} #${row.key}: ${row.reason}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
exitCode: result.plan.unmappable.length > 0 ? 1 : 0,
|
|
125
|
+
result,
|
|
126
|
+
plan,
|
|
127
|
+
unverified,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/** The `verify` command. */
|
|
131
|
+
export async function runVerify(options) {
|
|
132
|
+
const log = log_(options);
|
|
133
|
+
const payload = await (options.loadPayload ?? loadPayloadInstance)(options.configPath);
|
|
134
|
+
const result = await verifyImport({
|
|
135
|
+
payload,
|
|
136
|
+
sourceConnectionString: options.databaseUrl,
|
|
137
|
+
slugs: slugsOf(options),
|
|
138
|
+
});
|
|
139
|
+
if (!options.json) {
|
|
140
|
+
for (const check of result.checks) {
|
|
141
|
+
log(` ${check.passed ? 'ok ' : 'FAIL'} ${check.name}`);
|
|
142
|
+
}
|
|
143
|
+
for (const issue of result.issues) {
|
|
144
|
+
log(` [${issue.code}] ${issue.detail}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
/** The `rollback` command. */
|
|
150
|
+
export async function runRollback(options) {
|
|
151
|
+
const log = log_(options);
|
|
152
|
+
const manifestPath = options.manifestPath ?? defaultManifestPath;
|
|
153
|
+
const manifest = readManifest(manifestPath);
|
|
154
|
+
if (manifest === null) {
|
|
155
|
+
throw new Error(`no manifest at ${manifestPath}; nothing to roll back`);
|
|
156
|
+
}
|
|
157
|
+
if (manifest.finalized) {
|
|
158
|
+
throw new Error('the migration is finalized; rollback is no longer possible');
|
|
159
|
+
}
|
|
160
|
+
const payload = await (options.loadPayload ?? loadPayloadInstance)(options.configPath);
|
|
161
|
+
const result = await rollbackImport({ payload, manifest, log });
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
/** The `finalize` command. */
|
|
165
|
+
export function runFinalize(options) {
|
|
166
|
+
const log = log_(options);
|
|
167
|
+
const manifestPath = options.manifestPath ?? defaultManifestPath;
|
|
168
|
+
const manifest = readManifest(manifestPath);
|
|
169
|
+
if (manifest === null) {
|
|
170
|
+
return Promise.reject(new Error(`no manifest at ${manifestPath}; run --apply first`));
|
|
171
|
+
}
|
|
172
|
+
const finalized = finalizeManifest(manifest, manifestPath);
|
|
173
|
+
log(`finalized: the manifest at ${manifestPath} is now read-only. Legacy tables may be dropped in a separate, later migration — nothing is dropped for you.`);
|
|
174
|
+
return Promise.resolve(finalized);
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=run-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-import.js","sourceRoot":"","sources":["../../src/importer/run-import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Client } from 'pg';
|
|
2
|
+
import type { Unmappable } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Read side (issue #50): the payload-auth layout, straight from
|
|
5
|
+
* Postgres. Rows are read with plain SELECTs — the source tables are
|
|
6
|
+
* never modified until `finalize` (which only marks the manifest; the
|
|
7
|
+
* drop itself stays the operator's step).
|
|
8
|
+
*/
|
|
9
|
+
/** One payload-auth source user with its role rows and accounts. */
|
|
10
|
+
export type SourceUser = {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly email: string;
|
|
13
|
+
readonly name: string | null;
|
|
14
|
+
readonly emailVerified: boolean;
|
|
15
|
+
readonly image: string | null;
|
|
16
|
+
readonly createdAt: Date;
|
|
17
|
+
readonly updatedAt: Date;
|
|
18
|
+
/** Stored role values from the `users_role` child table. */
|
|
19
|
+
readonly roles: readonly string[];
|
|
20
|
+
readonly accounts: readonly SourceAccount[];
|
|
21
|
+
};
|
|
22
|
+
export type SourceAccount = {
|
|
23
|
+
readonly id: string;
|
|
24
|
+
readonly accountId: string;
|
|
25
|
+
readonly providerId: string;
|
|
26
|
+
readonly password: string | null;
|
|
27
|
+
readonly accessToken: string | null;
|
|
28
|
+
readonly refreshToken: string | null;
|
|
29
|
+
readonly idToken: string | null;
|
|
30
|
+
readonly scope: string | null;
|
|
31
|
+
readonly accessTokenExpiresAt: Date | null;
|
|
32
|
+
readonly refreshTokenExpiresAt: Date | null;
|
|
33
|
+
};
|
|
34
|
+
export type SourceRow = Record<string, unknown>;
|
|
35
|
+
export declare function openSource(connectionString: string): Promise<Client>;
|
|
36
|
+
export declare function countTables(client: Client, tables: readonly string[]): Promise<Record<string, number>>;
|
|
37
|
+
/** Every source user, with role rows and accounts attached. */
|
|
38
|
+
export declare function readSourceUsers(client: Client): Promise<SourceUser[]>;
|
|
39
|
+
/** Rows of one flat plugin table (sessions, verifications, apiKeys, jwks, …). */
|
|
40
|
+
export declare function readFlatRows(client: Client, table: string, columns: readonly string[]): Promise<SourceRow[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Members and invitations reference organizations and users by numeric
|
|
43
|
+
* id; the importer remaps to the target's baIds. Orphaned references
|
|
44
|
+
* are unmappable — they abort the run rather than skip silently.
|
|
45
|
+
*/
|
|
46
|
+
export declare function findOrphans(client: Client): Promise<readonly Unmappable[]>;
|
|
47
|
+
/** Users whose email never verified — reported, never granted `linkable`. */
|
|
48
|
+
export declare function unverifiedEmails(users: readonly SourceUser[]): readonly string[];
|
|
49
|
+
//# sourceMappingURL=source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/importer/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C;;;;;GAKG;AAEH,oEAAoE;AACpE,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;IACxB,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,IAAI,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,qBAAqB,EAAE,IAAI,GAAG,IAAI,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE/C,wBAAsB,UAAU,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI1E;AAoBD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,MAAM,EAAE,GACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAWjC;AAUD,+DAA+D;AAC/D,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAsD3E;AAED,iFAAiF;AACjF,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,OAAO,CAAC,SAAS,EAAE,CAAC,CAMtB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CA2ChF;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,MAAM,EAAE,CAEhF"}
|