@payload-auth-link/migrate 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +49 -2
  2. package/dist/cli.d.ts +7 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +257 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/doctor/bands.d.ts +16 -0
  7. package/dist/doctor/bands.d.ts.map +1 -0
  8. package/dist/doctor/bands.js +49 -0
  9. package/dist/doctor/bands.js.map +1 -0
  10. package/dist/doctor/database.d.ts +3 -0
  11. package/dist/doctor/database.d.ts.map +1 -0
  12. package/dist/doctor/database.js +110 -0
  13. package/dist/doctor/database.js.map +1 -0
  14. package/dist/doctor/plugins.d.ts +12 -0
  15. package/dist/doctor/plugins.d.ts.map +1 -0
  16. package/dist/doctor/plugins.js +202 -0
  17. package/dist/doctor/plugins.js.map +1 -0
  18. package/dist/doctor/run-doctor.d.ts +48 -0
  19. package/dist/doctor/run-doctor.d.ts.map +1 -0
  20. package/dist/doctor/run-doctor.js +236 -0
  21. package/dist/doctor/run-doctor.js.map +1 -0
  22. package/dist/doctor/source-scan.d.ts +10 -0
  23. package/dist/doctor/source-scan.d.ts.map +1 -0
  24. package/dist/doctor/source-scan.js +142 -0
  25. package/dist/doctor/source-scan.js.map +1 -0
  26. package/dist/doctor/types.d.ts +86 -0
  27. package/dist/doctor/types.d.ts.map +1 -0
  28. package/dist/doctor/types.js +7 -0
  29. package/dist/doctor/types.js.map +1 -0
  30. package/dist/doctor/users.d.ts +10 -0
  31. package/dist/doctor/users.d.ts.map +1 -0
  32. package/dist/doctor/users.js +176 -0
  33. package/dist/doctor/users.js.map +1 -0
  34. package/dist/importer/apply.d.ts +39 -0
  35. package/dist/importer/apply.d.ts.map +1 -0
  36. package/dist/importer/apply.js +588 -0
  37. package/dist/importer/apply.js.map +1 -0
  38. package/dist/importer/lifecycle.d.ts +52 -0
  39. package/dist/importer/lifecycle.d.ts.map +1 -0
  40. package/dist/importer/lifecycle.js +265 -0
  41. package/dist/importer/lifecycle.js.map +1 -0
  42. package/dist/importer/run-import.d.ts +40 -0
  43. package/dist/importer/run-import.d.ts.map +1 -0
  44. package/dist/importer/run-import.js +176 -0
  45. package/dist/importer/run-import.js.map +1 -0
  46. package/dist/importer/source.d.ts +49 -0
  47. package/dist/importer/source.d.ts.map +1 -0
  48. package/dist/importer/source.js +147 -0
  49. package/dist/importer/source.js.map +1 -0
  50. package/dist/importer/types.d.ts +69 -0
  51. package/dist/importer/types.d.ts.map +1 -0
  52. package/dist/importer/types.js +13 -0
  53. package/dist/importer/types.js.map +1 -0
  54. package/dist/index.d.ts +19 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +17 -0
  57. package/dist/index.js.map +1 -0
  58. package/package.json +70 -4
  59. package/src/cli.ts +287 -0
  60. package/src/doctor/bands.ts +66 -0
  61. package/src/doctor/database.ts +130 -0
  62. package/src/doctor/plugins.ts +216 -0
  63. package/src/doctor/run-doctor.ts +278 -0
  64. package/src/doctor/source-scan.ts +148 -0
  65. package/src/doctor/types.ts +92 -0
  66. package/src/doctor/users.ts +207 -0
  67. package/src/importer/apply.ts +731 -0
  68. package/src/importer/lifecycle.ts +328 -0
  69. package/src/importer/run-import.ts +237 -0
  70. package/src/importer/source.ts +211 -0
  71. package/src/importer/types.ts +96 -0
  72. package/src/index.ts +53 -0
@@ -0,0 +1,588 @@
1
+ import { readFlatRows, openSource, readSourceUsers } from './source.js';
2
+ import { defaultTargetSlugs, } from './types.js';
3
+ const slugsOf = (overrides) => ({
4
+ ...defaultTargetSlugs,
5
+ ...(overrides ?? {}),
6
+ });
7
+ function textOrNull(value) {
8
+ return typeof value === 'string' && value !== '' ? value : undefined;
9
+ }
10
+ function numberOrNull(value) {
11
+ if (value === null || value === undefined) {
12
+ return undefined;
13
+ }
14
+ const numeric = typeof value === 'number' ? value : Number(value);
15
+ return Number.isFinite(numeric) ? numeric : undefined;
16
+ }
17
+ /** Find an existing target row by `baId` — the resumable dedupe key. */
18
+ async function findByBaId(payload, collection, baId) {
19
+ const found = await payload.find({
20
+ collection,
21
+ where: { baId: { equals: baId } },
22
+ limit: 1,
23
+ depth: 0,
24
+ pagination: false,
25
+ overrideAccess: true,
26
+ });
27
+ return found.docs.length > 0;
28
+ }
29
+ /** Create one target row, deduped by its deterministic baId. */
30
+ async function createDeduped(payload, collection, baId, data, created, sourceKey) {
31
+ if (await findByBaId(payload, collection, baId)) {
32
+ return false;
33
+ }
34
+ const doc = await payload.create({
35
+ collection,
36
+ data: { baId, ...data },
37
+ overrideAccess: true,
38
+ });
39
+ if (typeof doc === 'object' && doc !== null && 'id' in doc) {
40
+ const id = doc['id'];
41
+ if (typeof id === 'string' || typeof id === 'number') {
42
+ created.push({ collection, id, sourceKey });
43
+ }
44
+ }
45
+ return true;
46
+ }
47
+ /** Capture a host field's current value for the rollback manifest. */
48
+ async function captureBefore(payload, hostId, field) {
49
+ const doc = await payload.findByID({
50
+ collection: 'users',
51
+ id: hostId,
52
+ depth: 0,
53
+ overrideAccess: true,
54
+ });
55
+ if (typeof doc !== 'object' || doc === null || !(field in doc)) {
56
+ return null;
57
+ }
58
+ return JSON.stringify(doc[field] ?? null);
59
+ }
60
+ /** Identity rows pre-populated on the host user (verified emails only). */
61
+ function identityRows(user, now) {
62
+ const rows = [];
63
+ for (const account of user.accounts) {
64
+ if (account.providerId === 'credential') {
65
+ // A password credential is not an identity: the engine signs the
66
+ // user in through ba-accounts; no link is claimed.
67
+ continue;
68
+ }
69
+ rows.push({
70
+ providerId: account.providerId,
71
+ providerUserId: account.accountId,
72
+ email: user.email,
73
+ linkedAt: now().toISOString(),
74
+ });
75
+ }
76
+ return rows;
77
+ }
78
+ export async function applyImport(options) {
79
+ const { payload, sourceConnectionString, apply, sessions, log = () => { }, now = () => new Date(), } = options;
80
+ const slugs = slugsOf(options.slugs);
81
+ const created = [...(options.manifest?.created ?? [])];
82
+ const fieldWrites = [...(options.manifest?.fieldWrites ?? [])];
83
+ const totals = { ...(options.manifest?.totals ?? {}) };
84
+ const planRows = [];
85
+ const unmappable = [];
86
+ let createdCount = 0;
87
+ let skippedCount = 0;
88
+ let fieldWriteCount = 0;
89
+ const record = (row) => {
90
+ planRows.push(row);
91
+ };
92
+ const client = await openSource(sourceConnectionString);
93
+ try {
94
+ const users = await readSourceUsers(client);
95
+ const seenUsers = new Set();
96
+ // --- 1. ba-users + host field writes ---------------------------------
97
+ for (const user of users) {
98
+ const baId = String(user.id);
99
+ if (seenUsers.has(baId)) {
100
+ unmappable.push({ model: 'user', key: baId, reason: 'duplicate source id' });
101
+ continue;
102
+ }
103
+ seenUsers.add(baId);
104
+ totals.user = (totals.user ?? 0) + 1;
105
+ const isNew = apply
106
+ ? await createDeduped(payload, slugs.user, baId, {
107
+ email: user.email,
108
+ name: user.name ?? '',
109
+ emailVerified: user.emailVerified,
110
+ ...(user.image === null ? {} : { image: user.image }),
111
+ createdAt: user.createdAt.toISOString(),
112
+ updatedAt: user.updatedAt.toISOString(),
113
+ }, created, `user:${baId}`)
114
+ : false;
115
+ if (apply) {
116
+ if (isNew) {
117
+ createdCount += 1;
118
+ }
119
+ else {
120
+ skippedCount += 1;
121
+ }
122
+ // Host-side writes on the EXISTING Payload user (the source
123
+ // layout's user id IS the host id): identities, roles, and the
124
+ // verified-email linking proof. Captured `before` values make
125
+ // rollback exact.
126
+ const hostId = Number(baId);
127
+ if (Number.isSafeInteger(hostId)) {
128
+ const writes = {
129
+ identities: identityRows(user, now),
130
+ linkable: user.emailVerified,
131
+ };
132
+ const fields = ['identities', 'roles', 'linkable', 'linkableEmail'];
133
+ for (const field of fields) {
134
+ fieldWrites.push({
135
+ collection: 'users',
136
+ id: hostId,
137
+ field,
138
+ before: await captureBefore(payload, hostId, field),
139
+ });
140
+ }
141
+ fieldWriteCount += fields.length;
142
+ if (user.roles.length > 0) {
143
+ // Stored role values pass through unchanged (issue #56: the
144
+ // storage edge owns translation; the map is the app's).
145
+ writes.roles = user.roles;
146
+ }
147
+ if (user.emailVerified) {
148
+ writes.linkableEmail = user.email;
149
+ }
150
+ await payload.update({
151
+ collection: 'users',
152
+ id: hostId,
153
+ data: writes,
154
+ overrideAccess: true,
155
+ });
156
+ }
157
+ }
158
+ record({
159
+ model: 'user',
160
+ sourceTable: 'users',
161
+ targetCollection: slugs.user,
162
+ rows: 1,
163
+ skipped: isNew ? 0 : apply ? 1 : 0,
164
+ unmappable: [],
165
+ });
166
+ }
167
+ // --- 2. accounts (hashes verbatim) ------------------------------------
168
+ for (const user of users) {
169
+ for (const account of user.accounts) {
170
+ totals.account = (totals.account ?? 0) + 1;
171
+ const baId = `acct-${account.id}`;
172
+ const isNew = apply
173
+ ? await createDeduped(payload, slugs.account, baId, {
174
+ accountId: account.accountId,
175
+ providerId: account.providerId,
176
+ userId: String(user.id),
177
+ ...(account.password === null ? {} : { password: account.password }),
178
+ ...(account.accessToken === null ? {} : { accessToken: account.accessToken }),
179
+ ...(account.refreshToken === null ? {} : { refreshToken: account.refreshToken }),
180
+ ...(account.idToken === null ? {} : { idToken: account.idToken }),
181
+ ...(account.scope === null ? {} : { scope: account.scope }),
182
+ ...(account.accessTokenExpiresAt === null
183
+ ? {}
184
+ : { accessTokenExpiresAt: account.accessTokenExpiresAt.toISOString() }),
185
+ ...(account.refreshTokenExpiresAt === null
186
+ ? {}
187
+ : { refreshTokenExpiresAt: account.refreshTokenExpiresAt.toISOString() }),
188
+ }, created, `account:${account.id}`)
189
+ : false;
190
+ if (apply) {
191
+ if (isNew) {
192
+ createdCount += 1;
193
+ }
194
+ else {
195
+ skippedCount += 1;
196
+ }
197
+ }
198
+ record({
199
+ model: 'account',
200
+ sourceTable: 'accounts',
201
+ targetCollection: slugs.account,
202
+ rows: 1,
203
+ skipped: isNew ? 0 : apply ? 1 : 0,
204
+ unmappable: [],
205
+ });
206
+ }
207
+ }
208
+ // --- 3. sessions (carry keeps every token) -----------------------------
209
+ if (sessions === 'carry') {
210
+ const rows = await readFlatRows(client, 'sessions', [
211
+ 'id',
212
+ 'user_id',
213
+ 'token',
214
+ 'expires_at',
215
+ 'ip_address',
216
+ 'user_agent',
217
+ 'created_at',
218
+ 'updated_at',
219
+ ]);
220
+ for (const row of rows) {
221
+ totals.session = (totals.session ?? 0) + 1;
222
+ const baId = `sess-${String(row.id)}`;
223
+ const isNew = apply
224
+ ? await createDeduped(payload, slugs.session, baId, {
225
+ userId: String(row.user_id),
226
+ token: String(row.token),
227
+ expiresAt: row.expires_at instanceof Date
228
+ ? row.expires_at.toISOString()
229
+ : now().toISOString(),
230
+ ...(textOrNull(row.ip_address) === undefined
231
+ ? {}
232
+ : { ipAddress: textOrNull(row.ip_address) }),
233
+ ...(textOrNull(row.user_agent) === undefined
234
+ ? {}
235
+ : { userAgent: textOrNull(row.user_agent) }),
236
+ ...(row.created_at instanceof Date
237
+ ? { createdAt: row.created_at.toISOString() }
238
+ : {}),
239
+ ...(row.updated_at instanceof Date
240
+ ? { updatedAt: row.updated_at.toISOString() }
241
+ : {}),
242
+ }, created, `session:${String(row.id)}`)
243
+ : false;
244
+ if (apply) {
245
+ if (isNew) {
246
+ createdCount += 1;
247
+ }
248
+ else {
249
+ skippedCount += 1;
250
+ }
251
+ }
252
+ record({
253
+ model: 'session',
254
+ sourceTable: 'sessions',
255
+ targetCollection: slugs.session,
256
+ rows: 1,
257
+ skipped: isNew ? 0 : apply ? 1 : 0,
258
+ unmappable: [],
259
+ });
260
+ }
261
+ }
262
+ // --- 4. verifications ---------------------------------------------------
263
+ const verifications = await readFlatRows(client, 'verifications', [
264
+ 'id',
265
+ 'identifier',
266
+ 'value',
267
+ 'expires_at',
268
+ ]);
269
+ for (const row of verifications) {
270
+ totals.verification = (totals.verification ?? 0) + 1;
271
+ const baId = `ver-${String(row.id)}`;
272
+ const isNew = apply
273
+ ? await createDeduped(payload, slugs.verification, baId, {
274
+ identifier: String(row.identifier),
275
+ value: String(row.value),
276
+ expiresAt: row.expires_at instanceof Date ? row.expires_at.toISOString() : now().toISOString(),
277
+ }, created, `verification:${String(row.id)}`)
278
+ : false;
279
+ if (apply) {
280
+ if (isNew) {
281
+ createdCount += 1;
282
+ }
283
+ else {
284
+ skippedCount += 1;
285
+ }
286
+ }
287
+ record({
288
+ model: 'verification',
289
+ sourceTable: 'verifications',
290
+ targetCollection: slugs.verification,
291
+ rows: 1,
292
+ skipped: isNew ? 0 : apply ? 1 : 0,
293
+ unmappable: [],
294
+ });
295
+ }
296
+ // --- 5. api keys (hash, prefix, metadata, rate-limit state) --------------
297
+ const apiKeys = await readFlatRows(client, 'api_keys', [
298
+ 'id',
299
+ 'config_id',
300
+ 'name',
301
+ 'start',
302
+ 'prefix',
303
+ 'key',
304
+ // payload-auth stores the satellite's userId as referenceId
305
+ // (the #49 field map's source side).
306
+ 'reference_id',
307
+ 'refill_interval',
308
+ 'refill_amount',
309
+ 'last_refill_at',
310
+ 'enabled',
311
+ 'rate_limit_enabled',
312
+ 'rate_limit_time_window',
313
+ 'rate_limit_max',
314
+ 'request_count',
315
+ 'remaining',
316
+ 'last_request',
317
+ 'expires_at',
318
+ 'permissions',
319
+ 'metadata',
320
+ ]);
321
+ for (const row of apiKeys) {
322
+ totals.apikey = (totals.apikey ?? 0) + 1;
323
+ const baId = `key-${String(row.id)}`;
324
+ const isNew = apply
325
+ ? await createDeduped(payload, slugs.apikey, baId, {
326
+ configId: textOrNull(row.config_id) ?? '',
327
+ ...(textOrNull(row.name) === undefined ? {} : { name: textOrNull(row.name) }),
328
+ ...(textOrNull(row.start) === undefined ? {} : { start: textOrNull(row.start) }),
329
+ ...(textOrNull(row.prefix) === undefined ? {} : { prefix: textOrNull(row.prefix) }),
330
+ key: String(row.key),
331
+ // The satellite's user reference arrives as referenceId in
332
+ // payload-auth layouts; BA 1.7's own schema names it the
333
+ // same, so the target field is offered both names.
334
+ userId: String(row.reference_id),
335
+ referenceId: String(row.reference_id),
336
+ ...(numberOrNull(row.refill_interval) === undefined
337
+ ? {}
338
+ : { refillInterval: numberOrNull(row.refill_interval) }),
339
+ ...(numberOrNull(row.refill_amount) === undefined
340
+ ? {}
341
+ : { refillAmount: numberOrNull(row.refill_amount) }),
342
+ ...(row.last_refill_at instanceof Date
343
+ ? { lastRefillAt: row.last_refill_at.toISOString() }
344
+ : {}),
345
+ ...(row.enabled === null ? {} : { enabled: row.enabled === true }),
346
+ ...(row.rate_limit_enabled === null
347
+ ? {}
348
+ : { rateLimitEnabled: row.rate_limit_enabled === true }),
349
+ ...(numberOrNull(row.rate_limit_time_window) === undefined
350
+ ? {}
351
+ : { rateLimitTimeWindow: numberOrNull(row.rate_limit_time_window) }),
352
+ ...(numberOrNull(row.rate_limit_max) === undefined
353
+ ? {}
354
+ : { rateLimitMax: numberOrNull(row.rate_limit_max) }),
355
+ ...(numberOrNull(row.request_count) === undefined
356
+ ? {}
357
+ : { requestCount: numberOrNull(row.request_count) }),
358
+ ...(numberOrNull(row.remaining) === undefined
359
+ ? {}
360
+ : { remaining: numberOrNull(row.remaining) }),
361
+ ...(row.last_request instanceof Date
362
+ ? { lastRequest: row.last_request.toISOString() }
363
+ : {}),
364
+ ...(row.expires_at instanceof Date
365
+ ? { expiresAt: row.expires_at.toISOString() }
366
+ : {}),
367
+ ...(textOrNull(row.permissions) === undefined
368
+ ? {}
369
+ : { permissions: textOrNull(row.permissions) }),
370
+ ...(textOrNull(row.metadata) === undefined
371
+ ? {}
372
+ : { metadata: textOrNull(row.metadata) }),
373
+ }, created, `apikey:${String(row.id)}`)
374
+ : false;
375
+ if (apply) {
376
+ if (isNew) {
377
+ createdCount += 1;
378
+ }
379
+ else {
380
+ skippedCount += 1;
381
+ }
382
+ }
383
+ record({
384
+ model: 'apikey',
385
+ sourceTable: 'api_keys',
386
+ targetCollection: slugs.apikey,
387
+ rows: 1,
388
+ skipped: isNew ? 0 : apply ? 1 : 0,
389
+ unmappable: [],
390
+ });
391
+ }
392
+ // --- 6. jwks --------------------------------------------------------------
393
+ const jwks = await readFlatRows(client, 'jwks', ['id', 'public_key', 'private_key']);
394
+ for (const row of jwks) {
395
+ totals.jwks = (totals.jwks ?? 0) + 1;
396
+ const baId = `jwks-${String(row.id)}`;
397
+ const isNew = apply
398
+ ? await createDeduped(payload, slugs.jwks, baId, {
399
+ publicKey: String(row.public_key),
400
+ privateKey: String(row.private_key),
401
+ }, created, `jwks:${String(row.id)}`)
402
+ : false;
403
+ if (apply) {
404
+ if (isNew) {
405
+ createdCount += 1;
406
+ }
407
+ else {
408
+ skippedCount += 1;
409
+ }
410
+ }
411
+ record({
412
+ model: 'jwks',
413
+ sourceTable: 'jwks',
414
+ targetCollection: slugs.jwks,
415
+ rows: 1,
416
+ skipped: isNew ? 0 : apply ? 1 : 0,
417
+ unmappable: [],
418
+ });
419
+ }
420
+ // --- 7. organization plugin rows ---------------------------------------
421
+ const organizations = await readFlatRows(client, 'organizations', [
422
+ 'id',
423
+ 'name',
424
+ 'slug',
425
+ 'logo',
426
+ 'metadata',
427
+ ]);
428
+ for (const row of organizations) {
429
+ totals.organization = (totals.organization ?? 0) + 1;
430
+ const baId = `org-${String(row.id)}`;
431
+ const isNew = apply
432
+ ? await createDeduped(payload, slugs.organization, baId, {
433
+ name: String(row.name),
434
+ slug: String(row.slug),
435
+ ...(textOrNull(row.logo) === undefined ? {} : { logo: textOrNull(row.logo) }),
436
+ ...(textOrNull(row.metadata) === undefined
437
+ ? {}
438
+ : { metadata: textOrNull(row.metadata) }),
439
+ }, created, `organization:${String(row.id)}`)
440
+ : false;
441
+ if (apply) {
442
+ if (isNew) {
443
+ createdCount += 1;
444
+ }
445
+ else {
446
+ skippedCount += 1;
447
+ }
448
+ }
449
+ record({
450
+ model: 'organization',
451
+ sourceTable: 'organizations',
452
+ targetCollection: slugs.organization,
453
+ rows: 1,
454
+ skipped: isNew ? 0 : apply ? 1 : 0,
455
+ unmappable: [],
456
+ });
457
+ }
458
+ const members = await readFlatRows(client, 'members', [
459
+ 'id',
460
+ 'organization_id',
461
+ 'user_id',
462
+ 'role',
463
+ ]);
464
+ for (const row of members) {
465
+ totals.member = (totals.member ?? 0) + 1;
466
+ const baId = `member-${String(row.id)}`;
467
+ const isNew = apply
468
+ ? await createDeduped(payload, slugs.member, baId, {
469
+ organizationId: `org-${String(row.organization_id)}`,
470
+ userId: String(row.user_id),
471
+ ...(textOrNull(row.role) === undefined ? {} : { role: textOrNull(row.role) }),
472
+ }, created, `member:${String(row.id)}`)
473
+ : false;
474
+ if (apply) {
475
+ if (isNew) {
476
+ createdCount += 1;
477
+ }
478
+ else {
479
+ skippedCount += 1;
480
+ }
481
+ }
482
+ record({
483
+ model: 'member',
484
+ sourceTable: 'members',
485
+ targetCollection: slugs.member,
486
+ rows: 1,
487
+ skipped: isNew ? 0 : apply ? 1 : 0,
488
+ unmappable: [],
489
+ });
490
+ }
491
+ const invitations = await readFlatRows(client, 'invitations', [
492
+ 'id',
493
+ 'organization_id',
494
+ 'email',
495
+ 'role',
496
+ 'status',
497
+ 'expires_at',
498
+ 'inviter_id',
499
+ ]);
500
+ for (const row of invitations) {
501
+ totals.invitation = (totals.invitation ?? 0) + 1;
502
+ const baId = `inv-${String(row.id)}`;
503
+ const isNew = apply
504
+ ? await createDeduped(payload, slugs.invitation, baId, {
505
+ organizationId: `org-${String(row.organization_id)}`,
506
+ email: String(row.email),
507
+ ...(textOrNull(row.role) === undefined ? {} : { role: textOrNull(row.role) }),
508
+ ...(textOrNull(row.status) === undefined ? {} : { status: textOrNull(row.status) }),
509
+ ...(row.expires_at instanceof Date
510
+ ? { expiresAt: row.expires_at.toISOString() }
511
+ : {}),
512
+ ...(typeof row.inviter_id === 'number' ? { inviterId: String(row.inviter_id) } : {}),
513
+ }, created, `invitation:${String(row.id)}`)
514
+ : false;
515
+ if (apply) {
516
+ if (isNew) {
517
+ createdCount += 1;
518
+ }
519
+ else {
520
+ skippedCount += 1;
521
+ }
522
+ }
523
+ record({
524
+ model: 'invitation',
525
+ sourceTable: 'invitations',
526
+ targetCollection: slugs.invitation,
527
+ rows: 1,
528
+ skipped: isNew ? 0 : apply ? 1 : 0,
529
+ unmappable: [],
530
+ });
531
+ }
532
+ log(`plan: ${planRows.length} row group(s), ${createdCount} created, ${skippedCount} skipped, ${fieldWriteCount} field writes`);
533
+ if (apply) {
534
+ // The manifest is the run's contract: merge this pass onto any
535
+ // resumed run's rows and write it back (issue #50).
536
+ const manifest = {
537
+ version: 1,
538
+ createdAt: options.manifest?.createdAt ?? now().toISOString(),
539
+ sourceDatabase: options.sourceDatabase,
540
+ options: { sessions },
541
+ created,
542
+ fieldWrites,
543
+ finalized: options.manifest?.finalized ?? false,
544
+ sourceCounts: options.sourceCounts,
545
+ totals: {
546
+ ...options.sourceCounts,
547
+ ...(options.manifest?.totals ?? {}),
548
+ ...totals,
549
+ },
550
+ };
551
+ const { writeManifest } = await import('./lifecycle.js');
552
+ writeManifest(manifest, options.manifestPath);
553
+ }
554
+ const plan = {
555
+ rows: planRows,
556
+ unmappable,
557
+ sessions,
558
+ warnings: [],
559
+ };
560
+ return {
561
+ created: createdCount,
562
+ skipped: skippedCount,
563
+ fieldWrites: fieldWriteCount,
564
+ plan,
565
+ };
566
+ }
567
+ finally {
568
+ await client.end();
569
+ }
570
+ }
571
+ /** Collapse per-row plan entries into one line per model (dry-run print). */
572
+ export function summarizePlanRows(rows) {
573
+ const byModel = new Map();
574
+ for (const row of rows) {
575
+ const existing = byModel.get(row.model);
576
+ if (existing === undefined) {
577
+ byModel.set(row.model, { ...row });
578
+ continue;
579
+ }
580
+ byModel.set(row.model, {
581
+ ...existing,
582
+ rows: existing.rows + row.rows,
583
+ skipped: existing.skipped + row.skipped,
584
+ });
585
+ }
586
+ return [...byModel.values()];
587
+ }
588
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/importer/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { Payload } from 'payload';
2
+ import type { ImportManifest } from './types.js';
3
+ /**
4
+ * Manifest lifecycle (issue #50): `verify` checks both sides, `rollback`
5
+ * undoes exactly what the manifest records, and `finalize` marks the
6
+ * manifest so the source tables may be dropped — by the operator, as a
7
+ * separate later step.
8
+ */
9
+ export declare const defaultManifestPath = "payload-auth-link-migration.json";
10
+ export declare function readManifest(path: string): ImportManifest | null;
11
+ export declare function writeManifest(manifest: ImportManifest, path: string): void;
12
+ export type VerifyIssue = {
13
+ readonly code: string;
14
+ readonly detail: string;
15
+ };
16
+ export type VerifyResult = {
17
+ readonly ok: boolean;
18
+ readonly issues: readonly VerifyIssue[];
19
+ readonly checks: readonly {
20
+ readonly name: string;
21
+ readonly passed: boolean;
22
+ }[];
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 declare function verifyImport(options: {
32
+ readonly payload: Payload;
33
+ readonly sourceConnectionString: string;
34
+ readonly slugs?: Readonly<Record<string, string>> | undefined;
35
+ }): Promise<VerifyResult>;
36
+ /**
37
+ * Rollback (issue #50): delete the created rows in reverse order and
38
+ * restore every captured field value. The manifest records exactly
39
+ * what to undo — nothing else is touched, and the source tables were
40
+ * never modified.
41
+ */
42
+ export declare function rollbackImport(options: {
43
+ readonly payload: Payload;
44
+ readonly manifest: ImportManifest;
45
+ readonly log?: (message: string) => void;
46
+ }): Promise<{
47
+ deleted: number;
48
+ restored: number;
49
+ }>;
50
+ /** Finalize (issue #50): the point of no return — mark the manifest. */
51
+ export declare function finalizeManifest(manifest: ImportManifest, path: string): ImportManifest;
52
+ //# sourceMappingURL=lifecycle.d.ts.map