@payload-auth-link/migrate 0.3.1 → 0.4.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.
Files changed (69) hide show
  1. package/README.md +6 -3
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +49 -6
  4. package/dist/cli.js.map +1 -1
  5. package/dist/codemods.d.ts +17 -8
  6. package/dist/codemods.d.ts.map +1 -1
  7. package/dist/codemods.js +439 -20
  8. package/dist/codemods.js.map +1 -1
  9. package/dist/doctor/database.d.ts +5 -1
  10. package/dist/doctor/database.d.ts.map +1 -1
  11. package/dist/doctor/database.js +98 -34
  12. package/dist/doctor/database.js.map +1 -1
  13. package/dist/doctor/plugins.d.ts +15 -0
  14. package/dist/doctor/plugins.d.ts.map +1 -1
  15. package/dist/doctor/plugins.js +43 -0
  16. package/dist/doctor/plugins.js.map +1 -1
  17. package/dist/doctor/run-doctor.d.ts +11 -0
  18. package/dist/doctor/run-doctor.d.ts.map +1 -1
  19. package/dist/doctor/run-doctor.js +66 -20
  20. package/dist/doctor/run-doctor.js.map +1 -1
  21. package/dist/doctor/source-scan.d.ts +5 -0
  22. package/dist/doctor/source-scan.d.ts.map +1 -1
  23. package/dist/doctor/source-scan.js +9 -0
  24. package/dist/doctor/source-scan.js.map +1 -1
  25. package/dist/doctor/types.d.ts +12 -0
  26. package/dist/doctor/types.d.ts.map +1 -1
  27. package/dist/exporters.d.ts +7 -0
  28. package/dist/exporters.d.ts.map +1 -1
  29. package/dist/exporters.js +36 -1
  30. package/dist/exporters.js.map +1 -1
  31. package/dist/importer/apply.d.ts +5 -0
  32. package/dist/importer/apply.d.ts.map +1 -1
  33. package/dist/importer/apply.js +61 -33
  34. package/dist/importer/apply.js.map +1 -1
  35. package/dist/importer/lifecycle.d.ts +15 -6
  36. package/dist/importer/lifecycle.d.ts.map +1 -1
  37. package/dist/importer/lifecycle.js +131 -39
  38. package/dist/importer/lifecycle.js.map +1 -1
  39. package/dist/importer/run-import.d.ts +6 -0
  40. package/dist/importer/run-import.d.ts.map +1 -1
  41. package/dist/importer/run-import.js +72 -20
  42. package/dist/importer/run-import.js.map +1 -1
  43. package/dist/importer/source.d.ts +47 -4
  44. package/dist/importer/source.d.ts.map +1 -1
  45. package/dist/importer/source.js +159 -27
  46. package/dist/importer/source.js.map +1 -1
  47. package/dist/importer/types.d.ts +33 -0
  48. package/dist/importer/types.d.ts.map +1 -1
  49. package/dist/importer/types.js +48 -0
  50. package/dist/importer/types.js.map +1 -1
  51. package/dist/index.d.ts +5 -3
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +5 -3
  54. package/dist/index.js.map +1 -1
  55. package/package.json +8 -11
  56. package/src/cli.ts +52 -6
  57. package/src/codemods.ts +537 -35
  58. package/src/doctor/database.ts +129 -46
  59. package/src/doctor/plugins.ts +51 -0
  60. package/src/doctor/run-doctor.ts +90 -25
  61. package/src/doctor/source-scan.ts +10 -0
  62. package/src/doctor/types.ts +9 -0
  63. package/src/exporters.ts +46 -1
  64. package/src/importer/apply.ts +78 -32
  65. package/src/importer/lifecycle.ts +163 -43
  66. package/src/importer/run-import.ts +102 -19
  67. package/src/importer/source.ts +214 -30
  68. package/src/importer/types.ts +86 -0
  69. package/src/index.ts +25 -2
package/dist/codemods.js CHANGED
@@ -1,44 +1,463 @@
1
+ import * as ts from 'typescript';
2
+ // --- shared parsing helpers -----------------------------------------------
3
+ function parse(content) {
4
+ return ts.createSourceFile('codemod-input.ts', content, ts.ScriptTarget.Latest, true);
5
+ }
6
+ function lineOf(source, node) {
7
+ return source.getLineAndCharacterOfPosition(node.getStart(source)).line + 1;
8
+ }
9
+ function applySplices(content, splices) {
10
+ let out = content;
11
+ for (const splice of [...splices].sort((a, b) => b.start - a.start)) {
12
+ out = out.slice(0, splice.start) + splice.text + out.slice(splice.end);
13
+ }
14
+ return out;
15
+ }
16
+ function escapeRegExp(text) {
17
+ return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
18
+ }
1
19
  /**
2
- * Codemods (issue #53): rule-based rewrites for the call sites a
3
- * payload-auth app must migrate. Deliberately textual and scoped —
4
- * each rule matches an exact, idiomatic payload-auth pattern and
5
- * leaves anything it cannot fully rewrite untouched (reported in the
6
- * result), because a half-rewritten call site is worse than an
7
- * explicit one.
20
+ * Whether the node sits where `await` is legal: inside an async
21
+ * function-like, or at module top level (top-level await). The cheap
22
+ * heuristic walks to the nearest enclosing function-like and looks for
23
+ * the `async` keyword (#70).
8
24
  */
25
+ function awaitContext(node) {
26
+ let current = node.parent;
27
+ while (current !== undefined) {
28
+ if (ts.isFunctionDeclaration(current) ||
29
+ ts.isMethodDeclaration(current) ||
30
+ ts.isArrowFunction(current) ||
31
+ ts.isFunctionExpression(current) ||
32
+ ts.isGetAccessorDeclaration(current) ||
33
+ ts.isSetAccessorDeclaration(current)) {
34
+ const async = current.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.AsyncKeyword) === true;
35
+ return async ? 'awaitable' : 'sync-function';
36
+ }
37
+ current = current.parent;
38
+ }
39
+ return 'awaitable';
40
+ }
41
+ /** The module specifier of a static import declaration. */
42
+ function moduleSpecifierOf(statement) {
43
+ const specifier = statement.moduleSpecifier;
44
+ return ts.isStringLiteral(specifier) ? specifier.text : '';
45
+ }
46
+ function soleNamedElement(statement) {
47
+ const clause = statement.importClause;
48
+ return (clause !== undefined &&
49
+ clause.name === undefined &&
50
+ clause.namedBindings !== undefined &&
51
+ ts.isNamedImports(clause.namedBindings) &&
52
+ clause.namedBindings.elements.length === 1);
53
+ }
54
+ /**
55
+ * Splice that removes one named import element plus an adjacent comma,
56
+ * keeping the rest of the clause valid.
57
+ */
58
+ function removeElementSplice(statement, element, source) {
59
+ const elements = statement.importClause?.namedBindings;
60
+ if (elements === undefined || !ts.isNamedImports(elements)) {
61
+ return { start: element.getStart(source), end: element.getEnd(), text: '' };
62
+ }
63
+ const index = elements.elements.indexOf(element);
64
+ const next = index >= 0 ? elements.elements[index + 1] : undefined;
65
+ if (next !== undefined) {
66
+ return { start: element.getStart(source), end: next.getStart(source), text: '' };
67
+ }
68
+ const previous = index > 0 ? elements.elements[index - 1] : undefined;
69
+ if (previous !== undefined) {
70
+ return { start: previous.getEnd(), end: element.getEnd(), text: '' };
71
+ }
72
+ return { start: element.getStart(source), end: element.getEnd(), text: '' };
73
+ }
74
+ // --- getPayloadAuth (#70.1) -------------------------------------------------
75
+ const payloadAuthModule = /^payload-auth(?:\/[A-Za-z0-9_./-]+)?$/;
76
+ function hasPayloadConfigImport(source) {
77
+ let found = false;
78
+ const visit = (node) => {
79
+ if (ts.isImportDeclaration(node)) {
80
+ if (moduleSpecifierOf(node) === '@payload-config') {
81
+ found = true;
82
+ }
83
+ }
84
+ else if (ts.isCallExpression(node) &&
85
+ node.expression.kind === ts.SyntaxKind.ImportKeyword &&
86
+ node.arguments.length === 1) {
87
+ const arg = node.arguments[0];
88
+ if (arg !== undefined && ts.isStringLiteral(arg) && arg.text === '@payload-config') {
89
+ found = true;
90
+ }
91
+ }
92
+ if (!found) {
93
+ ts.forEachChild(node, visit);
94
+ }
95
+ };
96
+ visit(source);
97
+ return found;
98
+ }
99
+ /**
100
+ * Every `getPayloadAuth` (or aliased) import and reference in the file,
101
+ * classified: a call that can be fully rewritten carries its
102
+ * replacement; anything else carries its manual-site reason.
103
+ */
104
+ function analyzePayloadAuth(content) {
105
+ const source = parse(content);
106
+ const imports = [];
107
+ for (const statement of source.statements) {
108
+ if (!ts.isImportDeclaration(statement) ||
109
+ !payloadAuthModule.test(moduleSpecifierOf(statement))) {
110
+ continue;
111
+ }
112
+ const clause = statement.importClause;
113
+ if (clause === undefined ||
114
+ clause.namedBindings === undefined ||
115
+ !ts.isNamedImports(clause.namedBindings)) {
116
+ continue;
117
+ }
118
+ for (const element of clause.namedBindings.elements) {
119
+ const exported = element.propertyName ?? element.name;
120
+ if (!ts.isIdentifier(exported) || exported.text !== 'getPayloadAuth') {
121
+ continue;
122
+ }
123
+ imports.push({
124
+ statement,
125
+ element,
126
+ local: element.name.text,
127
+ typeOnly: clause.isTypeOnly || element.isTypeOnly,
128
+ });
129
+ }
130
+ }
131
+ const locals = new Set(imports.map((imp) => imp.local));
132
+ const bindings = new Set();
133
+ for (const imp of imports) {
134
+ bindings.add(imp.element.name);
135
+ const exported = imp.element.propertyName;
136
+ if (exported !== undefined && ts.isIdentifier(exported)) {
137
+ bindings.add(exported);
138
+ }
139
+ }
140
+ const payloadConfig = hasPayloadConfigImport(source);
141
+ const refs = [];
142
+ const visit = (node) => {
143
+ if (ts.isIdentifier(node) && locals.has(node.text) && !bindings.has(node)) {
144
+ const parent = node.parent;
145
+ if (ts.isCallExpression(parent) && parent.expression === node) {
146
+ const context = awaitContext(parent);
147
+ const argCount = parent.arguments.length;
148
+ const firstArg = parent.arguments[0];
149
+ if (context === 'sync-function') {
150
+ refs.push({
151
+ node,
152
+ kind: 'call',
153
+ call: parent,
154
+ reason: `getPayloadAuth (line ${lineOf(source, parent)}) — the enclosing function is not async: make it async and use await getPayload({ config })`,
155
+ });
156
+ }
157
+ else if (argCount === 0) {
158
+ if (payloadConfig) {
159
+ refs.push({
160
+ node,
161
+ kind: 'call',
162
+ call: parent,
163
+ replacement: '(await getPayload({ config }))',
164
+ });
165
+ }
166
+ else {
167
+ refs.push({
168
+ node,
169
+ kind: 'call',
170
+ call: parent,
171
+ // The message spells the specifier without `from '…'`:
172
+ // shipped string literals must not read as imports
173
+ // (release:check scans for undeclared ones).
174
+ reason: `getPayloadAuth() (line ${lineOf(source, parent)}) — the no-arg form needs this file to import the payload config alias (@payload-config); add that import and use await getPayload({ config })`,
175
+ });
176
+ }
177
+ }
178
+ else if (argCount === 1 && firstArg !== undefined) {
179
+ refs.push({
180
+ node,
181
+ kind: 'call',
182
+ call: parent,
183
+ replacement: `(await getPayload({ config: ${firstArg.getText(source)} }))`,
184
+ });
185
+ }
186
+ else {
187
+ refs.push({
188
+ node,
189
+ kind: 'call',
190
+ call: parent,
191
+ reason: `getPayloadAuth (line ${lineOf(source, parent)}) — unexpected call shape (${argCount} arguments); call await getPayload({ config }) by hand`,
192
+ });
193
+ }
194
+ }
195
+ else if (ts.isTypeQueryNode(parent) && parent.exprName === node) {
196
+ refs.push({
197
+ node,
198
+ kind: 'type',
199
+ reason: `getPayloadAuth type reference (line ${lineOf(source, node)}) — use payload's own types instead: import type { Payload } from 'payload'`,
200
+ });
201
+ }
202
+ else {
203
+ refs.push({
204
+ node,
205
+ kind: 'value',
206
+ reason: `getPayloadAuth value reference (line ${lineOf(source, node)}) — rewrite by hand to await getPayload({ config })`,
207
+ });
208
+ }
209
+ }
210
+ ts.forEachChild(node, visit);
211
+ };
212
+ visit(source);
213
+ return { source, imports, refs };
214
+ }
215
+ /**
216
+ * The get-payload-auth rewrite (issue #70): ALL references rewritable,
217
+ * or nothing. A single manual site keeps the whole file's
218
+ * getPayloadAuth state untouched — the output must never reference a
219
+ * symbol no import provides.
220
+ */
221
+ function rewritePayloadAuth(content) {
222
+ const { source, imports, refs } = analyzePayloadAuth(content);
223
+ if (imports.length === 0 && refs.length === 0) {
224
+ return content;
225
+ }
226
+ if (refs.some((ref) => ref.reason !== undefined)) {
227
+ return content;
228
+ }
229
+ if (imports.some((imp) => imp.typeOnly)) {
230
+ return content;
231
+ }
232
+ const splices = [];
233
+ for (const ref of refs) {
234
+ if (ref.kind === 'call' && ref.call !== undefined && ref.replacement !== undefined) {
235
+ splices.push({
236
+ start: ref.call.getStart(source),
237
+ end: ref.call.getEnd(),
238
+ text: ref.replacement,
239
+ });
240
+ }
241
+ }
242
+ for (const imp of imports) {
243
+ if (soleNamedElement(imp.statement)) {
244
+ splices.push({
245
+ start: imp.statement.getStart(source),
246
+ end: imp.statement.getEnd(),
247
+ text: "import { getPayload } from 'payload'",
248
+ });
249
+ }
250
+ else {
251
+ splices.push(removeElementSplice(imp.statement, imp.element, source));
252
+ splices.push({
253
+ start: imp.statement.getStart(source),
254
+ end: imp.statement.getStart(source),
255
+ text: "import { getPayload } from 'payload'\n",
256
+ });
257
+ }
258
+ }
259
+ return applySplices(content, splices);
260
+ }
261
+ // --- <expr>.betterAuth.api.getSession (#70.2) -------------------------------
262
+ /** The receiver text when the callee is exactly `<expr>.betterAuth.api.getSession`. */
263
+ function betterAuthSessionReceiver(call, source) {
264
+ const callee = call.expression;
265
+ if (!ts.isPropertyAccessExpression(callee) || callee.name.text !== 'getSession') {
266
+ return null;
267
+ }
268
+ const api = callee.expression;
269
+ if (!ts.isPropertyAccessExpression(api) || api.name.text !== 'api') {
270
+ return null;
271
+ }
272
+ const betterAuth = api.expression;
273
+ if (!ts.isPropertyAccessExpression(betterAuth) || betterAuth.name.text !== 'betterAuth') {
274
+ return null;
275
+ }
276
+ // Aliased bindings (`const auth = payload.betterAuth`) are never
277
+ // rewritten — the rule matches only direct `.betterAuth.api` chains;
278
+ // findManualSites reports the surviving accessor.
279
+ return betterAuth.expression.getText(source);
280
+ }
281
+ /** The getSession argument text per #70: unwrap a lone `headers` object. */
282
+ function sessionArgsText(call, source) {
283
+ const arg = call.arguments[0];
284
+ if (call.arguments.length >= 1 &&
285
+ arg !== undefined &&
286
+ ts.isObjectLiteralExpression(arg) &&
287
+ arg.properties.length === 1) {
288
+ const prop = arg.properties[0];
289
+ if (prop !== undefined) {
290
+ if (ts.isPropertyAssignment(prop) && prop.name.getText(source) === 'headers') {
291
+ return prop.initializer.getText(source);
292
+ }
293
+ if (ts.isShorthandPropertyAssignment(prop) && prop.name.text === 'headers') {
294
+ return prop.name.getText(source);
295
+ }
296
+ }
297
+ }
298
+ return call.arguments.map((entry) => entry.getText(source)).join(', ');
299
+ }
300
+ function rewriteBetterAuthGetSession(content) {
301
+ const source = parse(content);
302
+ const splices = [];
303
+ const visit = (node) => {
304
+ if (ts.isCallExpression(node)) {
305
+ const receiver = betterAuthSessionReceiver(node, source);
306
+ if (receiver !== null && awaitContext(node) !== 'sync-function') {
307
+ splices.push({
308
+ start: node.getStart(source),
309
+ end: node.getEnd(),
310
+ text: `(await authLinkServer(${receiver}).getSession(${sessionArgsText(node, source)}))`,
311
+ });
312
+ }
313
+ }
314
+ ts.forEachChild(node, visit);
315
+ };
316
+ visit(source);
317
+ return applySplices(content, splices);
318
+ }
319
+ // --- toNextJsHandler (#70.3) ------------------------------------------------
320
+ const nextJsHandlerOutput = 'export const GET = createRouteHandlers.GET\nexport const POST = createRouteHandlers.POST';
321
+ function collectNextJsHandlerImports(source) {
322
+ const imports = [];
323
+ for (const statement of source.statements) {
324
+ if (!ts.isImportDeclaration(statement) ||
325
+ moduleSpecifierOf(statement) !== 'better-auth/next-js') {
326
+ continue;
327
+ }
328
+ const clause = statement.importClause;
329
+ if (clause === undefined ||
330
+ clause.namedBindings === undefined ||
331
+ !ts.isNamedImports(clause.namedBindings)) {
332
+ continue;
333
+ }
334
+ for (const element of clause.namedBindings.elements) {
335
+ const imported = (element.propertyName ?? element.name).text;
336
+ if (imported !== 'toNextJsHandler') {
337
+ continue;
338
+ }
339
+ imports.push({ statement, element, local: element.name.text });
340
+ }
341
+ }
342
+ return imports;
343
+ }
344
+ function rewriteNextJsHandler(content) {
345
+ const source = parse(content);
346
+ const imports = collectNextJsHandlerImports(source);
347
+ if (imports.length === 0) {
348
+ return content;
349
+ }
350
+ // The export-assignment shape stays textual (same output as #53),
351
+ // now matching the aliased local name too.
352
+ let current = content;
353
+ for (const imp of imports) {
354
+ const pattern = new RegExp(`export\\s*\\{\\s*(\\w+)\\s+as\\s+GET\\s*,\\s*(\\w+)\\s+as\\s+POST\\s*\\}\\s*=\\s*${escapeRegExp(imp.local)}\\s*\\(\\s*payload\\.betterAuth\\s*\\)`, 'g');
355
+ current = current.replace(pattern, nextJsHandlerOutput);
356
+ }
357
+ // The import rewrite runs on the rewritten content.
358
+ const after = parse(current);
359
+ const splices = [];
360
+ for (const imp of collectNextJsHandlerImports(after)) {
361
+ if (soleNamedElement(imp.statement)) {
362
+ splices.push({
363
+ start: imp.statement.getStart(after),
364
+ end: imp.statement.getEnd(),
365
+ text: "import { createRouteHandlers } from '@payload-auth-link/next'",
366
+ });
367
+ }
368
+ else {
369
+ splices.push(removeElementSplice(imp.statement, imp.element, after));
370
+ splices.push({
371
+ start: imp.statement.getStart(after),
372
+ end: imp.statement.getStart(after),
373
+ text: "import { createRouteHandlers } from '@payload-auth-link/next'\n",
374
+ });
375
+ }
376
+ }
377
+ return applySplices(current, splices);
378
+ }
379
+ // --- rules -------------------------------------------------------------------
9
380
  export const codemodRules = [
10
381
  {
11
382
  id: 'get-payload-auth',
12
- description: 'getPayloadAuth() -> getPayload({ config })',
13
- apply: (content) => content
14
- .replace(/import\s*\{\s*getPayloadAuth\s*(?:,[^}]*)?\}\s*from\s*['"]payload-auth['"];?/g, "import { getPayload } from 'payload'")
15
- .replace(/\bgetPayloadAuth\(\s*\)/g, 'await getPayload({ config })'),
383
+ description: 'getPayloadAuth() -> getPayload({ config }), import -> payload',
384
+ apply: rewritePayloadAuth,
16
385
  },
17
386
  {
18
387
  id: 'better-auth-get-session',
19
388
  description: 'payload.betterAuth.api.getSession({ headers }) -> authLinkServer(payload).getSession(headers)',
20
- apply: (content) => content.replace(/payload\.betterAuth\.api\.getSession\(\s*\{\s*headers\s*\}\s*\)/g, '(await authLinkServer(payload)).getSession(headers)'),
389
+ apply: rewriteBetterAuthGetSession,
21
390
  },
22
391
  {
23
392
  id: 'to-next-js-handler',
24
393
  description: 'toNextJsHandler(payload.betterAuth) -> createRouteHandlers from @payload-auth-link/next',
25
- apply: (content) => content
26
- .replace(/import\s*\{\s*toNextJsHandler\s*\}\s*from\s*['"]better-auth\/next-js['"];?/g, "import { createRouteHandlers } from '@payload-auth-link/next'")
27
- .replace(/export\s*\{\s*(\w+)\s+as\s+GET\s*,\s*(\w+)\s+as\s+POST\s*\}\s*=\s*toNextJsHandler\(\s*payload\.betterAuth\s*\)/g, 'export const GET = createRouteHandlers.GET\nexport const POST = createRouteHandlers.POST'),
394
+ apply: rewriteNextJsHandler,
28
395
  },
29
396
  ];
30
397
  /**
31
- * Report call sites the rules cannot fully rewrite — each one needs a
32
- * human decision (which session API call, which route handler shape).
398
+ * Report call sites the rules cannot fully rewrite (issue #70.4):
399
+ * EVERY remaining `getPayloadAuth` reference (calls, type references,
400
+ * the import itself), every surviving `payload.betterAuth` accessor
401
+ * (including `.betterAuth.api.<method>` and `$context`), and every
402
+ * `internalAdapter`. Nothing is silently ignored — the doctor counts
403
+ * these references, so the codemod must account for them.
33
404
  */
34
405
  export function findManualSites(content) {
406
+ const source = parse(content);
35
407
  const manual = [];
36
- if (/\bpayload\.betterAuth\.api\.(?!getSession\b)\w+/.test(content)) {
37
- manual.push('payload.betterAuth.api.<method> — see the authLinkServer session API (#54)');
408
+ const reportedLines = new Set();
409
+ const { imports, refs } = analyzePayloadAuth(content);
410
+ for (const ref of refs) {
411
+ if (ref.reason !== undefined) {
412
+ manual.push(ref.reason);
413
+ reportedLines.add(lineOf(source, ref.node));
414
+ }
38
415
  }
39
- if (/\$context\.(?:internalAdapter|adapter)\b/.test(content)) {
40
- manual.push('$context internals — see the supported server session API (#54)');
416
+ for (const imp of imports) {
417
+ manual.push(`getPayloadAuth import (line ${lineOf(source, imp.statement)}) — replace with import { getPayload } from 'payload'`);
418
+ reportedLines.add(lineOf(source, imp.statement));
41
419
  }
420
+ const seenInternalsLines = new Set();
421
+ const visit = (node) => {
422
+ // A getPayloadAuth reference the import analysis did not cover (a
423
+ // local binding, no payload-auth import) is still reported.
424
+ if (ts.isIdentifier(node) &&
425
+ node.text === 'getPayloadAuth' &&
426
+ !reportedLines.has(lineOf(source, node))) {
427
+ manual.push(`getPayloadAuth reference (line ${lineOf(source, node)}) — rewrite by hand to await getPayload({ config })`);
428
+ reportedLines.add(lineOf(source, node));
429
+ }
430
+ if (ts.isPropertyAccessExpression(node)) {
431
+ const line = lineOf(source, node);
432
+ if (node.name.text === 'betterAuth') {
433
+ const parent = node.parent;
434
+ if (ts.isPropertyAccessExpression(parent) && parent.name.text === 'api') {
435
+ const method = parent.parent;
436
+ if (ts.isPropertyAccessExpression(method) &&
437
+ method.name.text === 'getSession' &&
438
+ ts.isCallExpression(method.parent) &&
439
+ awaitContext(method.parent) === 'sync-function') {
440
+ manual.push(`getSession (line ${line}) — the enclosing function is not async: make it async and use await authLinkServer(...).getSession(...)`);
441
+ }
442
+ else {
443
+ manual.push(`payload.betterAuth.api.<method> (line ${line}) — see the authLinkServer session API (#54)`);
444
+ }
445
+ }
446
+ else {
447
+ manual.push(`payload.betterAuth accessor (line ${line}) — see the authLinkServer session API (#54)`);
448
+ }
449
+ }
450
+ else if (node.name.text === '$context') {
451
+ seenInternalsLines.add(line);
452
+ manual.push(`$context internals (line ${line}) — see the supported server session API (#54)`);
453
+ }
454
+ else if (node.name.text === 'internalAdapter' && !seenInternalsLines.has(line)) {
455
+ manual.push(`internalAdapter (line ${line}) — Better Auth internals; see the supported server session API (#54)`);
456
+ }
457
+ }
458
+ ts.forEachChild(node, visit);
459
+ };
460
+ visit(source);
42
461
  return manual;
43
462
  }
44
463
  /** Apply every rule to one file; reports what fired and what needs a human. */
@@ -1 +1 @@
1
- {"version":3,"file":"codemods.js","sourceRoot":"","sources":["../src/codemods.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoBH,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD;QACE,EAAE,EAAE,kBAAkB;QACtB,WAAW,EAAE,4CAA4C;QACzD,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CACjB,OAAO;aACJ,OAAO,CACN,+EAA+E,EAC/E,sCAAsC,CACvC;aACA,OAAO,CAAC,0BAA0B,EAAE,8BAA8B,CAAC;KACzE;IACD;QACE,EAAE,EAAE,yBAAyB;QAC7B,WAAW,EACT,+FAA+F;QACjG,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CACjB,OAAO,CAAC,OAAO,CACb,kEAAkE,EAClE,qDAAqD,CACtD;KACJ;IACD;QACE,EAAE,EAAE,oBAAoB;QACxB,WAAW,EACT,yFAAyF;QAC3F,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CACjB,OAAO;aACJ,OAAO,CACN,6EAA6E,EAC7E,+DAA+D,CAChE;aACA,OAAO,CACN,iHAAiH,EACjH,0FAA0F,CAC3F;KACN;CACF,CAAA;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,iDAAiD,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAA;IAC3F,CAAC;IACD,IAAI,0CAA0C,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAA;IAChF,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe;IACzD,IAAI,OAAO,GAAG,OAAO,CAAA;IACrB,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAChC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACrB,OAAO,GAAG,IAAI,CAAA;QAChB,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;IACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AAChF,CAAC"}
1
+ {"version":3,"file":"codemods.js","sourceRoot":"","sources":["../src/codemods.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,7 @@
1
1
  import type { DatabaseFinding } from './types.js';
2
- export declare function introspectDatabase(connectionString: string): Promise<DatabaseFinding>;
2
+ export type IntrospectOptions = {
3
+ /** Model → source table map (`--source-map`); defaults to the default layout. */
4
+ readonly sourceTables?: Readonly<Record<string, string | null>> | undefined;
5
+ };
6
+ export declare function introspectDatabase(connectionString: string, options?: IntrospectOptions): Promise<DatabaseFinding>;
3
7
  //# sourceMappingURL=database.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/doctor/database.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AA6DjD,wBAAsB,kBAAkB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAmE3F"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/doctor/database.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAqDjD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,iFAAiF;IACjF,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,CAAA;CAC5E,CAAA;AAED,wBAAsB,kBAAkB,CACtC,gBAAgB,EAAE,MAAM,EACxB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,eAAe,CAAC,CAiJ1B"}