supabase-nestjs 1.0.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 (50) hide show
  1. package/README.md +199 -0
  2. package/dist/index.d.ts +10 -0
  3. package/dist/index.js +26 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/supabase/auth/supabase-auth-optional.decorator.d.ts +1 -0
  6. package/dist/supabase/auth/supabase-auth-optional.decorator.js +8 -0
  7. package/dist/supabase/auth/supabase-auth-optional.decorator.js.map +1 -0
  8. package/dist/supabase/auth/supabase-auth-public.decorator.d.ts +1 -0
  9. package/dist/supabase/auth/supabase-auth-public.decorator.js +8 -0
  10. package/dist/supabase/auth/supabase-auth-public.decorator.js.map +1 -0
  11. package/dist/supabase/auth/supabase-auth.guard.d.ts +11 -0
  12. package/dist/supabase/auth/supabase-auth.guard.js +73 -0
  13. package/dist/supabase/auth/supabase-auth.guard.js.map +1 -0
  14. package/dist/supabase/auth/supabase-auth.module.d.ts +2 -0
  15. package/dist/supabase/auth/supabase-auth.module.js +28 -0
  16. package/dist/supabase/auth/supabase-auth.module.js.map +1 -0
  17. package/dist/supabase/auth/supabase-auth.types.d.ts +3 -0
  18. package/dist/supabase/auth/supabase-auth.types.js +3 -0
  19. package/dist/supabase/auth/supabase-auth.types.js.map +1 -0
  20. package/dist/supabase/decorators/inject-supabase-request.decorator.d.ts +1 -0
  21. package/dist/supabase/decorators/inject-supabase-request.decorator.js +8 -0
  22. package/dist/supabase/decorators/inject-supabase-request.decorator.js.map +1 -0
  23. package/dist/supabase/decorators/inject-supabase.decorator.d.ts +1 -0
  24. package/dist/supabase/decorators/inject-supabase.decorator.js +8 -0
  25. package/dist/supabase/decorators/inject-supabase.decorator.js.map +1 -0
  26. package/dist/supabase/decorators/supabase-user.decorator.d.ts +1 -0
  27. package/dist/supabase/decorators/supabase-user.decorator.js +9 -0
  28. package/dist/supabase/decorators/supabase-user.decorator.js.map +1 -0
  29. package/dist/supabase/providers/supabase-client.provider.d.ts +6 -0
  30. package/dist/supabase/providers/supabase-client.provider.js +16 -0
  31. package/dist/supabase/providers/supabase-client.provider.js.map +1 -0
  32. package/dist/supabase/providers/supabase-request-client.provider.d.ts +13 -0
  33. package/dist/supabase/providers/supabase-request-client.provider.js +31 -0
  34. package/dist/supabase/providers/supabase-request-client.provider.js.map +1 -0
  35. package/dist/supabase/supabase.constants.d.ts +3 -0
  36. package/dist/supabase/supabase.constants.js +7 -0
  37. package/dist/supabase/supabase.constants.js.map +1 -0
  38. package/dist/supabase/supabase.module.d.ts +6 -0
  39. package/dist/supabase/supabase.module.js +60 -0
  40. package/dist/supabase/supabase.module.js.map +1 -0
  41. package/dist/supabase/supabase.types.d.ts +11 -0
  42. package/dist/supabase/supabase.types.js +3 -0
  43. package/dist/supabase/supabase.types.js.map +1 -0
  44. package/dist/supabase/utils/supabase-error.d.ts +9 -0
  45. package/dist/supabase/utils/supabase-error.js +26 -0
  46. package/dist/supabase/utils/supabase-error.js.map +1 -0
  47. package/dist/supabase/utils/token-extractor.d.ts +3 -0
  48. package/dist/supabase/utils/token-extractor.js +14 -0
  49. package/dist/supabase/utils/token-extractor.js.map +1 -0
  50. package/package.json +43 -0
package/README.md ADDED
@@ -0,0 +1,199 @@
1
+ # nestjs-supabase
2
+
3
+ Drop Supabase into your NestJS app without the fuss. You get dependency injection, a request-scoped client that plays nice with RLS, an auth guard, and helpers to turn Supabase errors into proper Nest exceptions.
4
+
5
+ ## What you get
6
+
7
+ - **SupabaseModule** — Wire it up with `forRoot` or `forRootAsync`, depending on how you like to config things
8
+ - **Request-scoped client** — Sends the `Authorization` header along so Row Level Security actually works
9
+ - **Auth guard** — JWT validation out of the box; mark routes as `@Public()` when you want to skip it
10
+ - **Error helper** — No more manual `if (res.error)` checks; it maps Supabase errors to NestJS `HttpException`s
11
+ - **Decorators** — `@InjectSupabase()`, `@InjectSupabaseRequest()`, `@SupabaseUser()`, `@Public()`, `@SupabaseAuthOptional()` for cleaner code
12
+
13
+ ## Install
14
+
15
+ You’ll need NestJS 10 or 11 and Node 18+.
16
+
17
+ ```bash
18
+ npm install nestjs-supabase @supabase/supabase-js
19
+ ```
20
+
21
+ ## Setup
22
+
23
+ ### Static config
24
+
25
+ If your URL and key are plain env vars, this is all you need:
26
+
27
+ ```typescript
28
+ import { Module } from '@nestjs/common';
29
+ import { SupabaseModule } from 'nestjs-supabase';
30
+
31
+ @Module({
32
+ imports: [
33
+ SupabaseModule.forRoot({
34
+ url: process.env.SUPABASE_URL!,
35
+ key: process.env.SUPABASE_KEY!,
36
+ }),
37
+ ],
38
+ })
39
+ export class AppModule {}
40
+ ```
41
+
42
+ ### Async config (ConfigService)
43
+
44
+ Using `@nestjs/config`? No problem — use `forRootAsync` instead:
45
+
46
+ ```typescript
47
+ import { Module } from '@nestjs/common';
48
+ import { ConfigModule, ConfigService } from '@nestjs/config';
49
+ import { SupabaseModule } from 'nestjs-supabase';
50
+
51
+ @Module({
52
+ imports: [
53
+ SupabaseModule.forRootAsync({
54
+ inject: [ConfigService],
55
+ useFactory: (config: ConfigService) => ({
56
+ url: config.getOrThrow('SUPABASE_URL'),
57
+ key: config.getOrThrow('SUPABASE_SERVICE_KEY'),
58
+ }),
59
+ }),
60
+ ],
61
+ })
62
+ export class AppModule {}
63
+ ```
64
+
65
+ ## Usage
66
+
67
+ ### Admin / service role client
68
+
69
+ For backend-only stuff that bypasses RLS — cron jobs, migrations, admin APIs. Use your **service role key** here and keep it secret. Never expose it to the frontend.
70
+
71
+ ```typescript
72
+ import { Injectable } from '@nestjs/common';
73
+ import { InjectSupabase, throwIfSupabaseError } from 'nestjs-supabase';
74
+ import { SupabaseClient } from '@supabase/supabase-js';
75
+
76
+ @Injectable()
77
+ export class AdminService {
78
+ constructor(@InjectSupabase() private readonly supabase: SupabaseClient) {}
79
+
80
+ async allUsers() {
81
+ const res = await this.supabase.from('users').select('*');
82
+ throwIfSupabaseError(res);
83
+ return res.data;
84
+ }
85
+ }
86
+ ```
87
+
88
+ ### Request-scoped client (RLS)
89
+
90
+ When you’re dealing with user-facing data, use the request-scoped client. It forwards the Bearer token automatically, so RLS kicks in as expected.
91
+
92
+ **Heads up:** Any service that injects `@InjectSupabaseRequest()` needs to be request-scoped, or Nest will complain about scope mismatch.
93
+
94
+ ```typescript
95
+ import { Injectable, Scope } from '@nestjs/common';
96
+ import { InjectSupabaseRequest, throwIfSupabaseError } from 'nestjs-supabase';
97
+ import { SupabaseClient } from '@supabase/supabase-js';
98
+
99
+ @Injectable({ scope: Scope.REQUEST })
100
+ export class UsersService {
101
+ constructor(@InjectSupabaseRequest() private readonly supabase: SupabaseClient) {}
102
+
103
+ async me() {
104
+ const res = await this.supabase.from('profiles').select('*').single();
105
+ throwIfSupabaseError(res);
106
+ return res.data;
107
+ }
108
+ }
109
+ ```
110
+
111
+ ### Auth guard
112
+
113
+ `SupabaseAuthModule` turns on auth by default — every route expects a valid JWT. Add `@Public()` to routes or controllers you want to keep open:
114
+
115
+ ```typescript
116
+ import { Controller, Get } from '@nestjs/common';
117
+ import { Public, SupabaseUser } from 'nestjs-supabase';
118
+
119
+ @Controller('profile')
120
+ export class ProfileController {
121
+ @Get()
122
+ getProfile(@SupabaseUser() user: Record<string, unknown> | null) {
123
+ return user;
124
+ }
125
+ }
126
+
127
+ @Controller('health')
128
+ export class HealthController {
129
+ @Public()
130
+ @Get()
131
+ health() {
132
+ return { status: 'ok' };
133
+ }
134
+ }
135
+ ```
136
+
137
+ Don’t forget to import `SupabaseAuthModule` in your app module:
138
+
139
+ ```typescript
140
+ import { SupabaseAuthModule } from 'nestjs-supabase';
141
+
142
+ @Module({
143
+ imports: [SupabaseModule.forRoot(...), SupabaseAuthModule],
144
+ })
145
+ export class AppModule {}
146
+ ```
147
+
148
+ ### Optional auth
149
+
150
+ Sometimes a route should work for everyone, but you still want the user when they’re logged in. That’s what `@SupabaseAuthOptional()` is for:
151
+
152
+ ```typescript
153
+ import { Controller, Get } from '@nestjs/common';
154
+ import {
155
+ SupabaseAuthOptional,
156
+ SupabaseUser,
157
+ } from 'nestjs-supabase';
158
+
159
+ @Controller('feed')
160
+ export class FeedController {
161
+ @SupabaseAuthOptional()
162
+ @Get()
163
+ getFeed(@SupabaseUser() user: Record<string, unknown> | null) {
164
+ return { feed: [], userId: user?.id ?? null };
165
+ }
166
+ }
167
+ ```
168
+
169
+ ### Error helper
170
+
171
+ Supabase gives you `{ data, error }`. Instead of checking `res.error` everywhere, use `throwIfSupabaseError` — it turns those into proper NestJS exceptions:
172
+
173
+ ```typescript
174
+ const res = await this.supabase.from('users').select('*');
175
+ throwIfSupabaseError(res);
176
+ return res.data;
177
+ ```
178
+
179
+ Status mapping: 400 → BadRequest, 401 → Unauthorized, 403 → Forbidden, 404 → NotFound, 409 → Conflict.
180
+
181
+ ## API reference
182
+
183
+ | Export | What it does |
184
+ |--------|--------------|
185
+ | `SupabaseModule` | Core module; use `forRoot()` or `forRootAsync()` |
186
+ | `SupabaseModuleOptions` | Config for `forRoot()`; `url`, `key`, optional `options` (createClient 3rd param) |
187
+ | `SupabaseModuleAsyncOptions` | Config for `forRootAsync()`; `imports`, `inject`, `useFactory` |
188
+ | `SupabaseAuthModule` | Optional; registers `SupabaseAuthGuard` globally |
189
+ | `InjectSupabase()` | Inject the singleton client |
190
+ | `InjectSupabaseRequest()` | Inject the request-scoped client (RLS); consumer must be `Scope.REQUEST` |
191
+ | `SupabaseUser()` | Param decorator for `req.user` |
192
+ | `Public()` | Skip auth on a route or controller |
193
+ | `SupabaseAuthOptional()` | Allow unauthenticated requests; attach user when present |
194
+ | `SupabaseAuthGuard` | JWT validation guard |
195
+ | `throwIfSupabaseError(result)` | Convert Supabase errors to HttpException |
196
+
197
+ ## License
198
+
199
+ MIT
@@ -0,0 +1,10 @@
1
+ export * from './supabase/supabase.module';
2
+ export type { SupabaseModuleOptions, SupabaseModuleAsyncOptions } from './supabase/supabase.types';
3
+ export * from './supabase/decorators/inject-supabase.decorator';
4
+ export * from './supabase/decorators/inject-supabase-request.decorator';
5
+ export * from './supabase/decorators/supabase-user.decorator';
6
+ export * from './supabase/utils/supabase-error';
7
+ export * from './supabase/auth/supabase-auth.module';
8
+ export * from './supabase/auth/supabase-auth.guard';
9
+ export * from './supabase/auth/supabase-auth-optional.decorator';
10
+ export * from './supabase/auth/supabase-auth-public.decorator';
package/dist/index.js ADDED
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./supabase/supabase.module"), exports);
18
+ __exportStar(require("./supabase/decorators/inject-supabase.decorator"), exports);
19
+ __exportStar(require("./supabase/decorators/inject-supabase-request.decorator"), exports);
20
+ __exportStar(require("./supabase/decorators/supabase-user.decorator"), exports);
21
+ __exportStar(require("./supabase/utils/supabase-error"), exports);
22
+ __exportStar(require("./supabase/auth/supabase-auth.module"), exports);
23
+ __exportStar(require("./supabase/auth/supabase-auth.guard"), exports);
24
+ __exportStar(require("./supabase/auth/supabase-auth-optional.decorator"), exports);
25
+ __exportStar(require("./supabase/auth/supabase-auth-public.decorator"), exports);
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAA2C;AAG3C,kFAAgE;AAChE,0FAAwE;AACxE,gFAA8D;AAE9D,kEAAgD;AAEhD,uEAAqD;AACrD,sEAAoD;AACpD,mFAAiE;AACjE,iFAA+D"}
@@ -0,0 +1 @@
1
+ export declare const SupabaseAuthOptional: () => import("@nestjs/common").CustomDecorator<string>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SupabaseAuthOptional = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const supabase_auth_guard_1 = require("./supabase-auth.guard");
6
+ const SupabaseAuthOptional = () => (0, common_1.SetMetadata)(supabase_auth_guard_1.SUPABASE_AUTH_OPTIONAL, true);
7
+ exports.SupabaseAuthOptional = SupabaseAuthOptional;
8
+ //# sourceMappingURL=supabase-auth-optional.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-auth-optional.decorator.js","sourceRoot":"","sources":["../../../src/supabase/auth/supabase-auth-optional.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAC7C,+DAA+D;AAExD,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC,IAAA,oBAAW,EAAC,4CAAsB,EAAE,IAAI,CAAC,CAAC;AAAvE,QAAA,oBAAoB,wBAAmD"}
@@ -0,0 +1 @@
1
+ export declare const Public: () => import("@nestjs/common").CustomDecorator<string>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Public = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const supabase_auth_guard_1 = require("./supabase-auth.guard");
6
+ const Public = () => (0, common_1.SetMetadata)(supabase_auth_guard_1.SUPABASE_AUTH_PUBLIC, true);
7
+ exports.Public = Public;
8
+ //# sourceMappingURL=supabase-auth-public.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-auth-public.decorator.js","sourceRoot":"","sources":["../../../src/supabase/auth/supabase-auth-public.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAC7C,+DAA6D;AAEtD,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAA,oBAAW,EAAC,0CAAoB,EAAE,IAAI,CAAC,CAAC;AAAvD,QAAA,MAAM,UAAiD"}
@@ -0,0 +1,11 @@
1
+ import { CanActivate, ExecutionContext } from '@nestjs/common';
2
+ import { Reflector } from '@nestjs/core';
3
+ import { SupabaseClient } from '@supabase/supabase-js';
4
+ export declare const SUPABASE_AUTH_OPTIONAL = "supabase_auth_optional";
5
+ export declare const SUPABASE_AUTH_PUBLIC = "supabase_auth_public";
6
+ export declare class SupabaseAuthGuard implements CanActivate {
7
+ private readonly supabase;
8
+ private readonly reflector;
9
+ constructor(supabase: SupabaseClient, reflector: Reflector);
10
+ canActivate(context: ExecutionContext): Promise<boolean>;
11
+ }
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SupabaseAuthGuard = exports.SUPABASE_AUTH_PUBLIC = exports.SUPABASE_AUTH_OPTIONAL = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const core_1 = require("@nestjs/core");
18
+ const supabase_js_1 = require("@supabase/supabase-js");
19
+ const inject_supabase_decorator_1 = require("../decorators/inject-supabase.decorator");
20
+ const token_extractor_1 = require("../utils/token-extractor");
21
+ exports.SUPABASE_AUTH_OPTIONAL = 'supabase_auth_optional';
22
+ exports.SUPABASE_AUTH_PUBLIC = 'supabase_auth_public';
23
+ let SupabaseAuthGuard = class SupabaseAuthGuard {
24
+ constructor(supabase, reflector) {
25
+ this.supabase = supabase;
26
+ this.reflector = reflector;
27
+ }
28
+ async canActivate(context) {
29
+ const isPublic = this.reflector.getAllAndOverride(exports.SUPABASE_AUTH_PUBLIC, [
30
+ context.getHandler(),
31
+ context.getClass(),
32
+ ]) ?? false;
33
+ if (isPublic) {
34
+ const request = context.switchToHttp().getRequest();
35
+ request.user = null;
36
+ return true;
37
+ }
38
+ const optional = this.reflector.getAllAndOverride(exports.SUPABASE_AUTH_OPTIONAL, [
39
+ context.getHandler(),
40
+ context.getClass(),
41
+ ]) ?? false;
42
+ const request = context.switchToHttp().getRequest();
43
+ const token = (0, token_extractor_1.extractBearerToken)(request);
44
+ if (!token) {
45
+ if (optional) {
46
+ request.user = null;
47
+ return true;
48
+ }
49
+ throw new common_1.UnauthorizedException('Missing or invalid authorization header');
50
+ }
51
+ const { data: { user }, error, } = await this.supabase.auth.getUser(token);
52
+ if (error) {
53
+ if (optional) {
54
+ request.user = null;
55
+ return true;
56
+ }
57
+ throw new common_1.UnauthorizedException(error.message ?? 'Invalid token');
58
+ }
59
+ if (!user && !optional) {
60
+ throw new common_1.UnauthorizedException('User not found');
61
+ }
62
+ request.user = user ?? null;
63
+ return true;
64
+ }
65
+ };
66
+ exports.SupabaseAuthGuard = SupabaseAuthGuard;
67
+ exports.SupabaseAuthGuard = SupabaseAuthGuard = __decorate([
68
+ (0, common_1.Injectable)(),
69
+ __param(0, (0, inject_supabase_decorator_1.InjectSupabase)()),
70
+ __metadata("design:paramtypes", [supabase_js_1.SupabaseClient,
71
+ core_1.Reflector])
72
+ ], SupabaseAuthGuard);
73
+ //# sourceMappingURL=supabase-auth.guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-auth.guard.js","sourceRoot":"","sources":["../../../src/supabase/auth/supabase-auth.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAKwB;AACxB,uCAAyC;AACzC,uDAAuD;AACvD,uFAAyE;AACzE,8DAA8D;AAEjD,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAClD,QAAA,oBAAoB,GAAG,sBAAsB,CAAC;AAGpD,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAC5B,YACqC,QAAwB,EAC1C,SAAoB;QADF,aAAQ,GAAR,QAAQ,CAAgB;QAC1C,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,MAAM,QAAQ,GACZ,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAU,4BAAoB,EAAE;YAC9D,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CAAC,IAAI,KAAK,CAAC;QAEd,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;YACpD,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GACZ,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAU,8BAAsB,EAAE;YAChE,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CAAC,IAAI,KAAK,CAAC;QAEd,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,IAAA,oCAAkB,EAAC,OAAO,CAAC,CAAC;QAE1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;gBACpB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,8BAAqB,CAAC,yCAAyC,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,EACJ,IAAI,EAAE,EAAE,IAAI,EAAE,EACd,KAAK,GACN,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE5C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;gBACpB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,8BAAqB,CAAC,KAAK,CAAC,OAAO,IAAI,eAAe,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvB,MAAM,IAAI,8BAAqB,CAAC,gBAAgB,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAxDY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,0CAAc,GAAE,CAAA;qCAA4B,4BAAc;QAC/B,gBAAS;GAH5B,iBAAiB,CAwD7B"}
@@ -0,0 +1,2 @@
1
+ export declare class SupabaseAuthModule {
2
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SupabaseAuthModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const core_1 = require("@nestjs/core");
12
+ const supabase_auth_guard_1 = require("./supabase-auth.guard");
13
+ let SupabaseAuthModule = class SupabaseAuthModule {
14
+ };
15
+ exports.SupabaseAuthModule = SupabaseAuthModule;
16
+ exports.SupabaseAuthModule = SupabaseAuthModule = __decorate([
17
+ (0, common_1.Module)({
18
+ providers: [
19
+ supabase_auth_guard_1.SupabaseAuthGuard,
20
+ {
21
+ provide: core_1.APP_GUARD,
22
+ useClass: supabase_auth_guard_1.SupabaseAuthGuard,
23
+ },
24
+ ],
25
+ exports: [supabase_auth_guard_1.SupabaseAuthGuard],
26
+ })
27
+ ], SupabaseAuthModule);
28
+ //# sourceMappingURL=supabase-auth.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-auth.module.js","sourceRoot":"","sources":["../../../src/supabase/auth/supabase-auth.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,uCAAyC;AACzC,+DAA0D;AAYnD,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;CAAG,CAAA;AAArB,gDAAkB;6BAAlB,kBAAkB;IAV9B,IAAA,eAAM,EAAC;QACN,SAAS,EAAE;YACT,uCAAiB;YACjB;gBACE,OAAO,EAAE,gBAAS;gBAClB,QAAQ,EAAE,uCAAiB;aAC5B;SACF;QACD,OAAO,EAAE,CAAC,uCAAiB,CAAC;KAC7B,CAAC;GACW,kBAAkB,CAAG"}
@@ -0,0 +1,3 @@
1
+ export interface SupabaseAuthGuardOptions {
2
+ optional?: boolean;
3
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=supabase-auth.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-auth.types.js","sourceRoot":"","sources":["../../../src/supabase/auth/supabase-auth.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export declare const InjectSupabaseRequest: () => PropertyDecorator & ParameterDecorator;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InjectSupabaseRequest = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const supabase_constants_1 = require("../supabase.constants");
6
+ const InjectSupabaseRequest = () => (0, common_1.Inject)(supabase_constants_1.SUPABASE_REQUEST_CLIENT);
7
+ exports.InjectSupabaseRequest = InjectSupabaseRequest;
8
+ //# sourceMappingURL=inject-supabase-request.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-supabase-request.decorator.js","sourceRoot":"","sources":["../../../src/supabase/decorators/inject-supabase-request.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AACxC,8DAAgE;AAEzD,MAAM,qBAAqB,GAAG,GAAG,EAAE,CAAC,IAAA,eAAM,EAAC,4CAAuB,CAAC,CAAC;AAA9D,QAAA,qBAAqB,yBAAyC"}
@@ -0,0 +1 @@
1
+ export declare const InjectSupabase: () => PropertyDecorator & ParameterDecorator;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InjectSupabase = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const supabase_constants_1 = require("../supabase.constants");
6
+ const InjectSupabase = () => (0, common_1.Inject)(supabase_constants_1.SUPABASE_CLIENT);
7
+ exports.InjectSupabase = InjectSupabase;
8
+ //# sourceMappingURL=inject-supabase.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-supabase.decorator.js","sourceRoot":"","sources":["../../../src/supabase/decorators/inject-supabase.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AACxC,8DAAwD;AAEjD,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,IAAA,eAAM,EAAC,oCAAe,CAAC,CAAC;AAA/C,QAAA,cAAc,kBAAiC"}
@@ -0,0 +1 @@
1
+ export declare const SupabaseUser: (...dataOrPipes: unknown[]) => ParameterDecorator;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SupabaseUser = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ exports.SupabaseUser = (0, common_1.createParamDecorator)((_data, ctx) => {
6
+ const req = ctx.switchToHttp().getRequest();
7
+ return req.user ?? null;
8
+ });
9
+ //# sourceMappingURL=supabase-user.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-user.decorator.js","sourceRoot":"","sources":["../../../src/supabase/decorators/supabase-user.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAwE;AAE3D,QAAA,YAAY,GAAG,IAAA,6BAAoB,EAC9C,CAAC,KAAc,EAAE,GAAqB,EAAkC,EAAE;IACxE,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;IAC5C,OAAO,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;AAC1B,CAAC,CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SupabaseModuleOptions } from '../supabase.types';
2
+ export declare function createSupabaseClientFromOptions(opts: SupabaseModuleOptions): import("@supabase/supabase-js").SupabaseClient<any, "public", never, any, any>;
3
+ export declare function createSupabaseClientProvider(opts: SupabaseModuleOptions): {
4
+ provide: symbol;
5
+ useFactory: () => import("@supabase/supabase-js").SupabaseClient<any, "public", never, any, any>;
6
+ };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSupabaseClientFromOptions = createSupabaseClientFromOptions;
4
+ exports.createSupabaseClientProvider = createSupabaseClientProvider;
5
+ const supabase_js_1 = require("@supabase/supabase-js");
6
+ const supabase_constants_1 = require("../supabase.constants");
7
+ function createSupabaseClientFromOptions(opts) {
8
+ return (0, supabase_js_1.createClient)(opts.url, opts.key, opts.options);
9
+ }
10
+ function createSupabaseClientProvider(opts) {
11
+ return {
12
+ provide: supabase_constants_1.SUPABASE_CLIENT,
13
+ useFactory: () => createSupabaseClientFromOptions(opts),
14
+ };
15
+ }
16
+ //# sourceMappingURL=supabase-client.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-client.provider.js","sourceRoot":"","sources":["../../../src/supabase/providers/supabase-client.provider.ts"],"names":[],"mappings":";;AAIA,0EAEC;AAED,oEAKC;AAbD,uDAAqD;AACrD,8DAAwD;AAGxD,SAAgB,+BAA+B,CAAC,IAA2B;IACzE,OAAO,IAAA,0BAAY,EAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,4BAA4B,CAAC,IAA2B;IACtE,OAAO;QACL,OAAO,EAAE,oCAAe;QACxB,UAAU,EAAE,GAAG,EAAE,CAAC,+BAA+B,CAAC,IAAI,CAAC;KACxD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Scope } from '@nestjs/common';
2
+ import type { SupabaseModuleOptions } from '../supabase.types';
3
+ type RequestWithHeaders = {
4
+ headers?: Record<string, string | string[] | undefined>;
5
+ };
6
+ export declare function createSupabaseRequestClientFromOptions(opts: SupabaseModuleOptions, req: RequestWithHeaders): import("@supabase/supabase-js").SupabaseClient<any, "public", string, any, any>;
7
+ export declare function createSupabaseRequestClientProvider(opts: SupabaseModuleOptions): {
8
+ provide: symbol;
9
+ scope: Scope;
10
+ inject: string[];
11
+ useFactory: (req: RequestWithHeaders) => import("@supabase/supabase-js").SupabaseClient<any, "public", string, any, any>;
12
+ };
13
+ export {};
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSupabaseRequestClientFromOptions = createSupabaseRequestClientFromOptions;
4
+ exports.createSupabaseRequestClientProvider = createSupabaseRequestClientProvider;
5
+ const supabase_js_1 = require("@supabase/supabase-js");
6
+ const common_1 = require("@nestjs/common");
7
+ const core_1 = require("@nestjs/core");
8
+ const supabase_constants_1 = require("../supabase.constants");
9
+ const token_extractor_1 = require("../utils/token-extractor");
10
+ function createSupabaseRequestClientFromOptions(opts, req) {
11
+ const token = (0, token_extractor_1.extractBearerToken)(req);
12
+ return (0, supabase_js_1.createClient)(opts.url, opts.key, {
13
+ ...opts.options,
14
+ global: {
15
+ ...opts.options?.global,
16
+ headers: {
17
+ ...opts.options?.global?.headers,
18
+ ...(token ? { Authorization: `Bearer ${token}` } : {}),
19
+ },
20
+ },
21
+ });
22
+ }
23
+ function createSupabaseRequestClientProvider(opts) {
24
+ return {
25
+ provide: supabase_constants_1.SUPABASE_REQUEST_CLIENT,
26
+ scope: common_1.Scope.REQUEST,
27
+ inject: [core_1.REQUEST],
28
+ useFactory: (req) => createSupabaseRequestClientFromOptions(opts, req),
29
+ };
30
+ }
31
+ //# sourceMappingURL=supabase-request-client.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-request-client.provider.js","sourceRoot":"","sources":["../../../src/supabase/providers/supabase-request-client.provider.ts"],"names":[],"mappings":";;AASA,wFAeC;AAED,kFAOC;AAjCD,uDAAqD;AACrD,2CAAuC;AACvC,uCAAuC;AACvC,8DAAgE;AAEhE,8DAA8D;AAI9D,SAAgB,sCAAsC,CACpD,IAA2B,EAC3B,GAAuB;IAEvB,MAAM,KAAK,GAAG,IAAA,oCAAkB,EAAC,GAAG,CAAC,CAAC;IACtC,OAAO,IAAA,0BAAY,EAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;QACtC,GAAG,IAAI,CAAC,OAAO;QACf,MAAM,EAAE;YACN,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;YACvB,OAAO,EAAE;gBACP,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO;gBAChC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvD;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,mCAAmC,CAAC,IAA2B;IAC7E,OAAO;QACL,OAAO,EAAE,4CAAuB;QAChC,KAAK,EAAE,cAAK,CAAC,OAAO;QACpB,MAAM,EAAE,CAAC,cAAO,CAAC;QACjB,UAAU,EAAE,CAAC,GAAuB,EAAE,EAAE,CAAC,sCAAsC,CAAC,IAAI,EAAE,GAAG,CAAC;KAC3F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const SUPABASE_OPTIONS: unique symbol;
2
+ export declare const SUPABASE_CLIENT: unique symbol;
3
+ export declare const SUPABASE_REQUEST_CLIENT: unique symbol;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SUPABASE_REQUEST_CLIENT = exports.SUPABASE_CLIENT = exports.SUPABASE_OPTIONS = void 0;
4
+ exports.SUPABASE_OPTIONS = Symbol('SUPABASE_OPTIONS');
5
+ exports.SUPABASE_CLIENT = Symbol('SUPABASE_CLIENT');
6
+ exports.SUPABASE_REQUEST_CLIENT = Symbol('SUPABASE_REQUEST_CLIENT');
7
+ //# sourceMappingURL=supabase.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.constants.js","sourceRoot":"","sources":["../../src/supabase/supabase.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC9C,QAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAC5C,QAAA,uBAAuB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import type { SupabaseModuleAsyncOptions, SupabaseModuleOptions } from './supabase.types';
3
+ export declare class SupabaseModule {
4
+ static forRoot(options: SupabaseModuleOptions): DynamicModule;
5
+ static forRootAsync(options: SupabaseModuleAsyncOptions): DynamicModule;
6
+ }
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var SupabaseModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.SupabaseModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const core_1 = require("@nestjs/core");
13
+ const supabase_constants_1 = require("./supabase.constants");
14
+ const supabase_client_provider_1 = require("./providers/supabase-client.provider");
15
+ const supabase_request_client_provider_1 = require("./providers/supabase-request-client.provider");
16
+ let SupabaseModule = SupabaseModule_1 = class SupabaseModule {
17
+ static forRoot(options) {
18
+ return {
19
+ module: SupabaseModule_1,
20
+ global: true,
21
+ providers: [
22
+ (0, supabase_client_provider_1.createSupabaseClientProvider)(options),
23
+ (0, supabase_request_client_provider_1.createSupabaseRequestClientProvider)(options),
24
+ ],
25
+ exports: [supabase_constants_1.SUPABASE_CLIENT, supabase_constants_1.SUPABASE_REQUEST_CLIENT],
26
+ };
27
+ }
28
+ static forRootAsync(options) {
29
+ const asyncOptionsProvider = {
30
+ provide: supabase_constants_1.SUPABASE_OPTIONS,
31
+ inject: options.inject ?? [],
32
+ useFactory: options.useFactory,
33
+ };
34
+ return {
35
+ module: SupabaseModule_1,
36
+ global: true,
37
+ imports: options.imports ?? [],
38
+ providers: [
39
+ asyncOptionsProvider,
40
+ {
41
+ provide: supabase_constants_1.SUPABASE_CLIENT,
42
+ inject: [supabase_constants_1.SUPABASE_OPTIONS],
43
+ useFactory: supabase_client_provider_1.createSupabaseClientFromOptions,
44
+ },
45
+ {
46
+ provide: supabase_constants_1.SUPABASE_REQUEST_CLIENT,
47
+ scope: common_1.Scope.REQUEST,
48
+ inject: [supabase_constants_1.SUPABASE_OPTIONS, core_1.REQUEST],
49
+ useFactory: supabase_request_client_provider_1.createSupabaseRequestClientFromOptions,
50
+ },
51
+ ],
52
+ exports: [supabase_constants_1.SUPABASE_CLIENT, supabase_constants_1.SUPABASE_REQUEST_CLIENT],
53
+ };
54
+ }
55
+ };
56
+ exports.SupabaseModule = SupabaseModule;
57
+ exports.SupabaseModule = SupabaseModule = SupabaseModule_1 = __decorate([
58
+ (0, common_1.Module)({})
59
+ ], SupabaseModule);
60
+ //# sourceMappingURL=supabase.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.module.js","sourceRoot":"","sources":["../../src/supabase/supabase.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAA8D;AAC9D,uCAAuC;AACvC,6DAAkG;AAElG,mFAG8C;AAC9C,mGAGsD;AAG/C,IAAM,cAAc,sBAApB,MAAM,cAAc;IACzB,MAAM,CAAC,OAAO,CAAC,OAA8B;QAC3C,OAAO;YACL,MAAM,EAAE,gBAAc;YACtB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE;gBACT,IAAA,uDAA4B,EAAC,OAAO,CAAC;gBACrC,IAAA,sEAAmC,EAAC,OAAO,CAAC;aAC7C;YACD,OAAO,EAAE,CAAC,oCAAe,EAAE,4CAAuB,CAAC;SACpD,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAmC;QACrD,MAAM,oBAAoB,GAAG;YAC3B,OAAO,EAAE,qCAAgB;YACzB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,gBAAc;YACtB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,SAAS,EAAE;gBACT,oBAAoB;gBACpB;oBACE,OAAO,EAAE,oCAAe;oBACxB,MAAM,EAAE,CAAC,qCAAgB,CAAC;oBAC1B,UAAU,EAAE,0DAA+B;iBAC5C;gBACD;oBACE,OAAO,EAAE,4CAAuB;oBAChC,KAAK,EAAE,cAAK,CAAC,OAAO;oBACpB,MAAM,EAAE,CAAC,qCAAgB,EAAE,cAAO,CAAC;oBACnC,UAAU,EAAE,yEAAsC;iBACnD;aACF;YACD,OAAO,EAAE,CAAC,oCAAe,EAAE,4CAAuB,CAAC;SACpD,CAAC;IACJ,CAAC;CACF,CAAA;AAzCY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,cAAc,CAyC1B"}
@@ -0,0 +1,11 @@
1
+ import type { createClient } from '@supabase/supabase-js';
2
+ export interface SupabaseModuleOptions {
3
+ url: string;
4
+ key: string;
5
+ options?: Parameters<typeof createClient>[2];
6
+ }
7
+ export interface SupabaseModuleAsyncOptions {
8
+ imports?: any[];
9
+ inject?: any[];
10
+ useFactory: (...args: any[]) => SupabaseModuleOptions | Promise<SupabaseModuleOptions>;
11
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=supabase.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.types.js","sourceRoot":"","sources":["../../src/supabase/supabase.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export declare function throwIfSupabaseError<T extends {
2
+ error?: {
3
+ status?: number;
4
+ code?: string | number;
5
+ message?: string;
6
+ };
7
+ }>(result: T): asserts result is T & {
8
+ error: undefined;
9
+ };
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.throwIfSupabaseError = throwIfSupabaseError;
4
+ const common_1 = require("@nestjs/common");
5
+ function throwIfSupabaseError(result) {
6
+ const err = result?.error;
7
+ if (!err)
8
+ return;
9
+ const status = (err.status ?? err.code);
10
+ const message = err.message ?? 'Supabase error';
11
+ switch (status) {
12
+ case 400:
13
+ throw new common_1.BadRequestException(message);
14
+ case 401:
15
+ throw new common_1.UnauthorizedException(message);
16
+ case 403:
17
+ throw new common_1.ForbiddenException(message);
18
+ case 404:
19
+ throw new common_1.NotFoundException(message);
20
+ case 409:
21
+ throw new common_1.ConflictException(message);
22
+ default:
23
+ throw new common_1.InternalServerErrorException(message);
24
+ }
25
+ }
26
+ //# sourceMappingURL=supabase-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-error.js","sourceRoot":"","sources":["../../../src/supabase/utils/supabase-error.ts"],"names":[],"mappings":";;AASA,oDAuBC;AAhCD,2CAOwB;AAExB,SAAgB,oBAAoB,CAClC,MAAS;IAET,MAAM,GAAG,GAAG,MAAM,EAAE,KAAK,CAAC;IAC1B,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAuB,CAAC;IAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,gBAAgB,CAAC;IAEhD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,GAAG;YACN,MAAM,IAAI,4BAAmB,CAAC,OAAO,CAAC,CAAC;QACzC,KAAK,GAAG;YACN,MAAM,IAAI,8BAAqB,CAAC,OAAO,CAAC,CAAC;QAC3C,KAAK,GAAG;YACN,MAAM,IAAI,2BAAkB,CAAC,OAAO,CAAC,CAAC;QACxC,KAAK,GAAG;YACN,MAAM,IAAI,0BAAiB,CAAC,OAAO,CAAC,CAAC;QACvC,KAAK,GAAG;YACN,MAAM,IAAI,0BAAiB,CAAC,OAAO,CAAC,CAAC;QACvC;YACE,MAAM,IAAI,qCAA4B,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function extractBearerToken(req: {
2
+ headers?: Record<string, string | string[] | undefined>;
3
+ } | null): string | null;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractBearerToken = extractBearerToken;
4
+ function extractBearerToken(req) {
5
+ const raw = req?.headers?.authorization || req?.headers?.Authorization;
6
+ const header = Array.isArray(raw) ? raw[0] : raw;
7
+ if (!header || typeof header !== 'string')
8
+ return null;
9
+ const [type, token] = header.split(' ');
10
+ if (type?.toLowerCase() !== 'bearer' || !token)
11
+ return null;
12
+ return token;
13
+ }
14
+ //# sourceMappingURL=token-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-extractor.js","sourceRoot":"","sources":["../../../src/supabase/utils/token-extractor.ts"],"names":[],"mappings":";;AAAA,gDAOC;AAPD,SAAgB,kBAAkB,CAAC,GAAuE;IACxG,MAAM,GAAG,GAAG,GAAG,EAAE,OAAO,EAAE,aAAa,IAAI,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC;IACvE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACjD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,IAAI,EAAE,WAAW,EAAE,KAAK,QAAQ,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAC5D,OAAO,KAAK,CAAC;AACf,CAAC"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "supabase-nestjs",
3
+ "version": "1.0.0",
4
+ "description": "Supabase integration for NestJS, request-scoped client with RLS, auth guard, and error helpers",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "scripts": {
11
+ "build": "tsc -p tsconfig.build.json",
12
+ "prepare": "npm run build"
13
+ },
14
+ "keywords": [
15
+ "nestjs",
16
+ "supabase",
17
+ "rls",
18
+ "auth"
19
+ ],
20
+ "author": "Erfan Hekmati",
21
+ "license": "MIT",
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/erfanhekmati/nestjs-supabase.git"
25
+ },
26
+ "bugs": {
27
+ "url": "https://github.com/erfanhekmati/nestjs-supabase/issues"
28
+ },
29
+ "peerDependencies": {
30
+ "@nestjs/common": "^10 || ^11",
31
+ "@nestjs/core": "^10 || ^11"
32
+ },
33
+ "dependencies": {
34
+ "@supabase/supabase-js": "^2"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^20",
38
+ "typescript": "^5"
39
+ },
40
+ "engines": {
41
+ "node": ">=18"
42
+ }
43
+ }