You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
backfill: database handles are published on globalThis #625
Why it was done this way, and it is a real constraint.src/backfill/gaps.ts must not import ../db at module load. Several suites mock ../config only partially, and importing db.ts evaluates config.db.url at load time — so an eager import makes unrelated tests fail with Cannot read properties of undefined (reading 'url'). The globals are a decoupling seam, not laziness.
Why it is still worth changing.src/db.ts runs in the API process, not just the CLI, so every request handler shares a process where a live Prisma client and pg pool are reachable as globalThis.__lens_prisma by any code at all — including a dependency that never imported them. It is also untyped on both ends, so a refactor of db.ts will not surface here.
What I tried and why it is not a quick fix. I attempted two versions while merging and reverted both:
Importing the handles in gaps.ts with the global as an override — breaks 6 suites on the load-time config.db.url evaluation described above.
Moving the installation into scripts/backfill.ts and making the accessors throw when absent — breaks 33 suites, because the API routes reach gaps.ts without installing anything.
So it needs a deliberate approach rather than an in-flight patch. Options worth weighing:
Make src/db.ts lazy — build the client on first use rather than at module load — which removes the reason for the seam entirely and is probably the real fix.
Pass the handles in as arguments to the backfill functions, so the dependency is explicit and the tests inject rather than mock.
Keep the seam but confine it: a small src/backfill/handles.ts with typed getters and a setter, so at least it is typed, greppable and not on globalThis.
Not urgent — the current arrangement works and the feature is live. Worth doing before anything else starts reading those globals, because every new reader makes it harder to remove.
Activity