Commit Graph

3 Commits

Author SHA1 Message Date
bogdantarasenko 3052a6b309 feat: add NestJS adapter (#55)
* feat: add NestJS adapter

Ships `@supabase/server/adapters/nestjs`:

- `withSupabase(opts)` — class guard for `@UseGuards()` and
  `useGlobalGuards()`, supporting Express and Fastify
- `@SupabaseCtx(key?, ...pipes)` — param decorator returning the full
  SupabaseContext or a single field, with NestJS pipes applied to the
  extracted value
- 401s thrown as `HttpException` with `{ message, code }`; the
  underlying `AuthError` is exposed on `cause`

Adds `@nestjs/common` as an optional peer dep (`^10 || ^11`), wires the
new export in package.json / jsr.json / tsdown.config.ts, and enables
`experimentalDecorators` + `emitDecoratorMetadata` in tsconfig. Test
setup uses unplugin-swc via vitest.config.ts so integration tests can
boot a real Nest app on both Express and Fastify.

Docs: README quickstart + docs/adapters/nestjs.md.

* refactor(nestjs): address PR review feedback

- Scope `experimentalDecorators` + `emitDecoratorMetadata` to
  `src/adapters/nestjs/tsconfig.json` (extends root) and exclude the
  adapter from the root project so the options aren't enforced
  repo-wide. `typecheck` now runs both projects.
- Convert `vitest.config.ts` to the `projects` syntax so the
  `unplugin-swc` transform applies only to the nestjs project; the unit
  project runs unchanged with esbuild.
- Throw `HttpException` (500, `unsupported_context`) instead of
  returning true on non-HTTP execution contexts so misuse fails loudly
  on the first request rather than silently no-op'ing on every
  RPC/WebSocket message.
- Remove the "skip if context already set" branch so handler-level
  guards can tighten what a global guard set. Previously the outer
  (global) guard always won under Nest's global → controller → handler
  order, so a stricter handler-level guard could be silently bypassed.
  Tests updated; `@SupabaseCtx` decorator unchanged.
- Drop unused `CanActivate` import from integration.test.ts.

* docs(nestjs): update guard behavior section to match new semantics

The guard no longer skips when a prior context exists — it always
re-evaluates. Rewrite the doc section to match the JSDoc wording and
the inner-rejects/inner-overwrites tests.
2026-05-27 11:03:56 -05:00
Tomás Pozo d206e5cdb1 feat: implement server-side DX primitives, wrappers, and adapters (#6)
Two-layer architecture:
- Layer 1 (wrappers): withSupabase
- Layer 2 (core): verifyAuth, verifyCredentials,
  extractCredentials, createContextClient,
  createAdminClient, resolveEnv

Features:
- Auth modes: always, public, secret, user
(with named key support).
- CORS handling built into withSupabase.
- Hono middleware adapter.
- JWKS-based JWT verification via jose.

---------

Co-authored-by: Kalleby Santos <kalleby_santos@hotmail.com>
2026-03-20 01:36:52 -05:00
Katerina Skroumpelou e2c51541f5 init commit 2026-02-24 18:06:08 +02:00