@soulbatical/tetra-core 0.1.11 → 0.1.13

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.
package/dist/index.d.ts CHANGED
@@ -83,6 +83,8 @@ export { AffiliateClickService } from './shared/affiliate/AffiliateClickService.
83
83
  export { defaultAffiliateFeatureConfig } from './shared/affiliate/affiliateFeatureConfig.js';
84
84
  export { addAffiliateAdminRoutes, addAffiliateUserRoutes, addAffiliatePublicRoutes } from './shared/affiliate/routes.js';
85
85
  export type { AffiliateConfig, AffiliateTierConfig, AffiliateAttribution, AffiliateOrder, Affiliate, AffiliateCommission, AffiliateClick, AffiliatePayment, AffiliateTierHistory, AffiliateFilters, AffiliateDashboard, AffiliateDashboardStats, AffiliateDashboardCommission, AffiliateTierProgress } from './shared/affiliate/types.js';
86
+ export { addPublicAuthRoutes } from './shared/auth/routes.js';
87
+ export type { PublicAuthRoutesConfig, OnNewUserResult, OAuthProvider, InviteConfig, UserProfileOrg } from './shared/auth/types.js';
86
88
  export { createApp } from './core/createApp.js';
87
89
  export type { CreateAppConfig } from './core/createApp.js';
88
90
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -79,6 +79,8 @@ export { AffiliateAttributionService } from './shared/affiliate/AffiliateAttribu
79
79
  export { AffiliateClickService } from './shared/affiliate/AffiliateClickService.js';
80
80
  export { defaultAffiliateFeatureConfig } from './shared/affiliate/affiliateFeatureConfig.js';
81
81
  export { addAffiliateAdminRoutes, addAffiliateUserRoutes, addAffiliatePublicRoutes } from './shared/affiliate/routes.js';
82
+ // ─── Public Auth Routes ─────────────────────────────────────
83
+ export { addPublicAuthRoutes } from './shared/auth/routes.js';
82
84
  // ─── App Bootstrap ──────────────────────────────────────────
83
85
  export { createApp } from './core/createApp.js';
84
86
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAMtE,+DAA+D;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AACxF,OAAO,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAC;AAE9F,+DAA+D;AAC/D,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AAE3G,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAEzE,+DAA+D;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE,gEAAgE;AAChE,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,wBAAwB,EAAE,WAAW,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE9N,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAChJ,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAC5G,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAGvE,2CAA2C;AAC3C,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,kBAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAG9K,mCAAmC;AACnC,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAGtP,+DAA+D;AAC/D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAEpO,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAGpH,+DAA+D;AAC/D,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC1H,OAAO,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAKpI,gEAAgE;AAChE,wEAAwE;AACxE,uFAAuF;AAEvF,8DAA8D;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,8DAA8D;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACpF,OAAO,EAAE,6BAA6B,EAAE,MAAM,8CAA8C,CAAC;AAC7F,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAGzH,+DAA+D;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAMtE,+DAA+D;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AACxF,OAAO,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAC;AAE9F,+DAA+D;AAC/D,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AAE3G,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAEzE,+DAA+D;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE,gEAAgE;AAChE,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,wBAAwB,EAAE,WAAW,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE9N,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAChJ,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAC5G,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAGvE,2CAA2C;AAC3C,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,kBAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAG9K,mCAAmC;AACnC,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAGtP,+DAA+D;AAC/D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAEpO,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AACpG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAGpH,+DAA+D;AAC/D,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC1H,OAAO,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAKpI,gEAAgE;AAChE,wEAAwE;AACxE,uFAAuF;AAEvF,8DAA8D;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,8DAA8D;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,mDAAmD,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACpF,OAAO,EAAE,6BAA6B,EAAE,MAAM,8CAA8C,CAAC;AAC7F,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAGzH,+DAA+D;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG9D,+DAA+D;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { addPublicAuthRoutes } from './routes.js';
2
+ export type { PublicAuthRoutesConfig, OnNewUserResult, OAuthProvider, InviteConfig, UserProfileOrg } from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { addPublicAuthRoutes } from './routes.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Public Auth Routes — Factory
3
+ *
4
+ * Standardized authentication routes for all Tetra projects.
5
+ * Handles: login, signup, OAuth, token refresh, session, /me, register,
6
+ * logout, and optionally invites.
7
+ *
8
+ * Usage:
9
+ * ```typescript
10
+ * import { addPublicAuthRoutes } from '@soulbatical/tetra-core';
11
+ *
12
+ * const publicAuthRouter = Router();
13
+ * addPublicAuthRoutes(publicAuthRouter, {
14
+ * oauthProviders: ['google'],
15
+ * enableInvites: true,
16
+ * onNewUser: async (supabaseUser, systemClient) => {
17
+ * // Create org + users_public + membership
18
+ * return { organizationId: org.id };
19
+ * },
20
+ * });
21
+ * app.use('/api/public/auth', publicAuthRouter);
22
+ * ```
23
+ */
24
+ import { Router } from 'express';
25
+ import type { PublicAuthRoutesConfig } from './types.js';
26
+ /**
27
+ * Add standard public authentication routes to a router.
28
+ *
29
+ * Routes created (always):
30
+ * - POST /login — Email + password login
31
+ * - POST /signup — Email + password signup
32
+ * - POST /refresh — Refresh an expired access token
33
+ * - GET /session — Validate token, return user info
34
+ * - GET /:provider — Start OAuth flow (e.g., GET /google)
35
+ * - POST /exchange — Exchange OAuth code for tokens
36
+ * - POST /register — Auto-provision user profile + org
37
+ * - POST /logout — Invalidate session
38
+ *
39
+ * Routes created (enableMe, default true):
40
+ * - GET /me — Full user profile + organizations + role
41
+ *
42
+ * Routes created (enableInvites):
43
+ * - POST /invite — Create org invite (requires auth)
44
+ * - POST /invite/accept — Accept invite (requires auth)
45
+ * - GET /invite/:token — Get invite details (public)
46
+ */
47
+ export declare function addPublicAuthRoutes(router: Router, config?: PublicAuthRoutesConfig): void;
48
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/shared/auth/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAIpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAyBzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,sBAA2B,GAClC,IAAI,CA6pBN"}
@@ -0,0 +1,629 @@
1
+ /**
2
+ * Public Auth Routes — Factory
3
+ *
4
+ * Standardized authentication routes for all Tetra projects.
5
+ * Handles: login, signup, OAuth, token refresh, session, /me, register,
6
+ * logout, and optionally invites.
7
+ *
8
+ * Usage:
9
+ * ```typescript
10
+ * import { addPublicAuthRoutes } from '@soulbatical/tetra-core';
11
+ *
12
+ * const publicAuthRouter = Router();
13
+ * addPublicAuthRoutes(publicAuthRouter, {
14
+ * oauthProviders: ['google'],
15
+ * enableInvites: true,
16
+ * onNewUser: async (supabaseUser, systemClient) => {
17
+ * // Create org + users_public + membership
18
+ * return { organizationId: org.id };
19
+ * },
20
+ * });
21
+ * app.use('/api/public/auth', publicAuthRouter);
22
+ * ```
23
+ */
24
+ import { createClient } from '@supabase/supabase-js';
25
+ import { createLogger } from '../../utils/logger.js';
26
+ import { RFC7807ErrorResponse } from '../rfc7807ErrorResponse.js';
27
+ const logger = createLogger('http:routes:auth');
28
+ // ─── Helpers ─────────────────────────────────────────────────
29
+ function getServiceRoleClient() {
30
+ const url = process.env.SUPABASE_URL;
31
+ const key = process.env.SUPABASE_SERVICE_ROLE_KEY;
32
+ if (!url || !key) {
33
+ throw new Error('Missing SUPABASE_URL or SUPABASE_SERVICE_ROLE_KEY');
34
+ }
35
+ return createClient(url, key, {
36
+ auth: { autoRefreshToken: false, persistSession: false },
37
+ });
38
+ }
39
+ function extractToken(req) {
40
+ const header = req.headers.authorization;
41
+ if (!header?.startsWith('Bearer '))
42
+ return null;
43
+ return header.substring(7);
44
+ }
45
+ // ─── Route Factory ───────────────────────────────────────────
46
+ /**
47
+ * Add standard public authentication routes to a router.
48
+ *
49
+ * Routes created (always):
50
+ * - POST /login — Email + password login
51
+ * - POST /signup — Email + password signup
52
+ * - POST /refresh — Refresh an expired access token
53
+ * - GET /session — Validate token, return user info
54
+ * - GET /:provider — Start OAuth flow (e.g., GET /google)
55
+ * - POST /exchange — Exchange OAuth code for tokens
56
+ * - POST /register — Auto-provision user profile + org
57
+ * - POST /logout — Invalidate session
58
+ *
59
+ * Routes created (enableMe, default true):
60
+ * - GET /me — Full user profile + organizations + role
61
+ *
62
+ * Routes created (enableInvites):
63
+ * - POST /invite — Create org invite (requires auth)
64
+ * - POST /invite/accept — Accept invite (requires auth)
65
+ * - GET /invite/:token — Get invite details (public)
66
+ */
67
+ export function addPublicAuthRoutes(router, config = {}) {
68
+ const frontendUrl = config.frontendUrl || process.env.FRONTEND_URL || 'http://localhost:3000';
69
+ const callbackPath = config.callbackPath || '/auth/callback';
70
+ const oauthProviders = config.oauthProviders || ['google'];
71
+ const getSystemDB = config.getSystemDB || getServiceRoleClient;
72
+ const enableMe = config.enableMe !== false; // default true
73
+ const meExtraFields = config.meExtraFields || '';
74
+ // ── POST /login ────────────────────────────────────────────
75
+ router.post('/login', async (req, res) => {
76
+ const { email, password } = req.body;
77
+ if (!email || !password) {
78
+ RFC7807ErrorResponse.badRequest(res, 'Email and password are required');
79
+ return;
80
+ }
81
+ try {
82
+ const supabase = getSystemDB();
83
+ const { data, error } = await supabase.auth.signInWithPassword({ email, password });
84
+ if (error || !data.session || !data.user) {
85
+ logger.warn({ email, error: error?.message }, 'Login failed');
86
+ RFC7807ErrorResponse.unauthorized(res, 'Invalid email or password');
87
+ return;
88
+ }
89
+ logger.info({ email, userId: data.user.id }, 'Login successful');
90
+ res.json({
91
+ success: true,
92
+ data: {
93
+ access_token: data.session.access_token,
94
+ refresh_token: data.session.refresh_token,
95
+ expires_in: data.session.expires_in,
96
+ expires_at: data.session.expires_at,
97
+ user: { id: data.user.id, email: data.user.email },
98
+ },
99
+ });
100
+ }
101
+ catch (err) {
102
+ logger.error({ err }, 'Login error');
103
+ RFC7807ErrorResponse.internalError(res, 'Internal server error');
104
+ }
105
+ });
106
+ // ── POST /signup ───────────────────────────────────────────
107
+ router.post('/signup', async (req, res) => {
108
+ const { email, password } = req.body;
109
+ if (!email || !password) {
110
+ RFC7807ErrorResponse.badRequest(res, 'Email and password are required');
111
+ return;
112
+ }
113
+ if (password.length < 8) {
114
+ RFC7807ErrorResponse.badRequest(res, 'Password must be at least 8 characters');
115
+ return;
116
+ }
117
+ try {
118
+ const supabase = getSystemDB();
119
+ const { data, error } = await supabase.auth.signUp({ email, password });
120
+ if (error) {
121
+ logger.warn({ email, error: error.message }, 'Signup failed');
122
+ if (error.message.includes('already registered')) {
123
+ RFC7807ErrorResponse.send(res, 409, 'conflict', 'Conflict', 'An account with this email already exists. Try logging in instead.');
124
+ return;
125
+ }
126
+ RFC7807ErrorResponse.badRequest(res, error.message);
127
+ return;
128
+ }
129
+ if (!data.session || !data.user) {
130
+ // Email confirmation required
131
+ res.json({
132
+ success: true,
133
+ data: {
134
+ requiresConfirmation: true,
135
+ message: 'Check your email to confirm your account.',
136
+ },
137
+ });
138
+ return;
139
+ }
140
+ logger.info({ email, userId: data.user.id }, 'Signup successful');
141
+ res.status(201).json({
142
+ success: true,
143
+ data: {
144
+ access_token: data.session.access_token,
145
+ refresh_token: data.session.refresh_token,
146
+ expires_in: data.session.expires_in,
147
+ expires_at: data.session.expires_at,
148
+ user: { id: data.user.id, email: data.user.email },
149
+ },
150
+ });
151
+ }
152
+ catch (err) {
153
+ logger.error({ err }, 'Signup error');
154
+ RFC7807ErrorResponse.internalError(res, 'Internal server error');
155
+ }
156
+ });
157
+ // ── POST /refresh ──────────────────────────────────────────
158
+ router.post('/refresh', async (req, res) => {
159
+ const { refresh_token } = req.body;
160
+ if (!refresh_token) {
161
+ RFC7807ErrorResponse.badRequest(res, 'refresh_token is required');
162
+ return;
163
+ }
164
+ try {
165
+ const supabase = getSystemDB();
166
+ const { data, error } = await supabase.auth.refreshSession({ refresh_token });
167
+ if (error || !data.session) {
168
+ logger.warn({ error: error?.message }, 'Token refresh failed');
169
+ RFC7807ErrorResponse.unauthorized(res, 'Invalid or expired refresh token');
170
+ return;
171
+ }
172
+ res.json({
173
+ success: true,
174
+ data: {
175
+ access_token: data.session.access_token,
176
+ refresh_token: data.session.refresh_token,
177
+ expires_in: data.session.expires_in,
178
+ expires_at: data.session.expires_at,
179
+ user: { id: data.user.id, email: data.user.email },
180
+ },
181
+ });
182
+ }
183
+ catch (err) {
184
+ logger.error({ err }, 'Refresh error');
185
+ RFC7807ErrorResponse.internalError(res, 'Internal server error');
186
+ }
187
+ });
188
+ // ── GET /session ───────────────────────────────────────────
189
+ router.get('/session', async (req, res) => {
190
+ const token = extractToken(req);
191
+ if (!token) {
192
+ RFC7807ErrorResponse.unauthorized(res, 'No token provided');
193
+ return;
194
+ }
195
+ try {
196
+ const supabase = getSystemDB();
197
+ const { data, error } = await supabase.auth.getUser(token);
198
+ if (error || !data.user) {
199
+ RFC7807ErrorResponse.unauthorized(res, 'Invalid or expired token');
200
+ return;
201
+ }
202
+ res.json({
203
+ success: true,
204
+ data: {
205
+ user: { id: data.user.id, email: data.user.email },
206
+ },
207
+ });
208
+ }
209
+ catch (err) {
210
+ logger.error({ err }, 'Session check error');
211
+ RFC7807ErrorResponse.internalError(res, 'Internal server error');
212
+ }
213
+ });
214
+ // ── GET /me ────────────────────────────────────────────────
215
+ if (enableMe) {
216
+ router.get('/me', async (req, res) => {
217
+ const token = extractToken(req);
218
+ if (!token) {
219
+ RFC7807ErrorResponse.unauthorized(res, 'Authentication required');
220
+ return;
221
+ }
222
+ try {
223
+ const supabase = getSystemDB();
224
+ const { data: { user }, error } = await supabase.auth.getUser(token);
225
+ if (error || !user) {
226
+ RFC7807ErrorResponse.unauthorized(res, 'Invalid or expired token');
227
+ return;
228
+ }
229
+ // Load user profile
230
+ const baseFields = 'id, email, is_superadmin, active_organization_id';
231
+ const selectFields = meExtraFields ? `${baseFields}, ${meExtraFields}` : baseFields;
232
+ const { data: profile } = await supabase
233
+ .from('users_public')
234
+ .select(selectFields)
235
+ .eq('id', user.id)
236
+ .maybeSingle();
237
+ // Load organization memberships with org details
238
+ const { data: memberships } = await supabase
239
+ .from('organization_members')
240
+ .select('organization_id, role, organizations(id, name, slug, logo_url)')
241
+ .eq('user_id', user.id)
242
+ .eq('status', 'active');
243
+ const organizations = (memberships || []).map((m) => ({
244
+ id: m.organizations?.id,
245
+ name: m.organizations?.name,
246
+ slug: m.organizations?.slug,
247
+ logo_url: m.organizations?.logo_url,
248
+ role: m.role,
249
+ }));
250
+ const p = profile;
251
+ const activeOrganizationId = p?.active_organization_id || organizations[0]?.id || null;
252
+ const activeOrg = organizations.find((o) => o.id === activeOrganizationId);
253
+ // Build response — spread profile to include any extra fields
254
+ const { id: _id, email: _email, is_superadmin: _sa, active_organization_id: _aoi, ...extraFields } = p || {};
255
+ res.json({
256
+ success: true,
257
+ data: {
258
+ id: user.id,
259
+ email: user.email,
260
+ is_superadmin: p?.is_superadmin || false,
261
+ role: activeOrg?.role || null,
262
+ active_organization_id: activeOrganizationId,
263
+ organizations,
264
+ ...extraFields,
265
+ },
266
+ });
267
+ }
268
+ catch (err) {
269
+ logger.error({ err }, 'Profile fetch error');
270
+ RFC7807ErrorResponse.internalError(res, 'Internal server error');
271
+ }
272
+ });
273
+ }
274
+ // ── GET /:provider (OAuth start) ──────────────────────────
275
+ for (const provider of oauthProviders) {
276
+ router.get(`/${provider}`, async (req, res) => {
277
+ try {
278
+ const supabase = getSystemDB();
279
+ const returnTo = req.query.returnTo || '/';
280
+ const callbackUrl = returnTo !== '/'
281
+ ? `${frontendUrl}${callbackPath}?returnTo=${encodeURIComponent(returnTo)}`
282
+ : `${frontendUrl}${callbackPath}`;
283
+ const { data, error } = await supabase.auth.signInWithOAuth({
284
+ provider,
285
+ options: { redirectTo: callbackUrl },
286
+ });
287
+ if (error || !data.url) {
288
+ logger.error({ error: error?.message, provider }, 'OAuth initiation failed');
289
+ RFC7807ErrorResponse.internalError(res, `Failed to initiate ${provider} login`);
290
+ return;
291
+ }
292
+ res.redirect(data.url);
293
+ }
294
+ catch (err) {
295
+ logger.error({ err, provider }, 'OAuth error');
296
+ RFC7807ErrorResponse.internalError(res, 'Internal server error');
297
+ }
298
+ });
299
+ }
300
+ // ── POST /exchange ─────────────────────────────────────────
301
+ router.post('/exchange', async (req, res) => {
302
+ const { code } = req.body;
303
+ if (!code) {
304
+ RFC7807ErrorResponse.badRequest(res, 'Authorization code is required');
305
+ return;
306
+ }
307
+ try {
308
+ const supabase = getSystemDB();
309
+ const { data, error } = await supabase.auth.exchangeCodeForSession(code);
310
+ if (error || !data.session || !data.user) {
311
+ logger.warn({ error: error?.message }, 'Code exchange failed');
312
+ RFC7807ErrorResponse.unauthorized(res, 'Failed to exchange authorization code');
313
+ return;
314
+ }
315
+ logger.info({ email: data.user.email, userId: data.user.id }, 'OAuth login successful');
316
+ res.json({
317
+ success: true,
318
+ data: {
319
+ access_token: data.session.access_token,
320
+ refresh_token: data.session.refresh_token,
321
+ expires_in: data.session.expires_in,
322
+ expires_at: data.session.expires_at,
323
+ user: { id: data.user.id, email: data.user.email },
324
+ },
325
+ });
326
+ }
327
+ catch (err) {
328
+ logger.error({ err }, 'Code exchange error');
329
+ RFC7807ErrorResponse.internalError(res, 'Internal server error');
330
+ }
331
+ });
332
+ // ── POST /register (auto-provision) ────────────────────────
333
+ router.post('/register', async (req, res) => {
334
+ const token = extractToken(req);
335
+ if (!token) {
336
+ RFC7807ErrorResponse.unauthorized(res, 'Authentication required. Include Bearer token.');
337
+ return;
338
+ }
339
+ try {
340
+ const supabase = getSystemDB();
341
+ const { data: { user }, error } = await supabase.auth.getUser(token);
342
+ if (error || !user) {
343
+ RFC7807ErrorResponse.unauthorized(res, 'Invalid or expired token');
344
+ return;
345
+ }
346
+ // Check if user already has a profile with an org
347
+ const { data: existingProfile } = await supabase
348
+ .from('users_public')
349
+ .select('id, active_organization_id')
350
+ .eq('id', user.id)
351
+ .maybeSingle();
352
+ if (existingProfile?.active_organization_id) {
353
+ res.json({
354
+ success: true,
355
+ data: {
356
+ alreadyRegistered: true,
357
+ organizationId: existingProfile.active_organization_id,
358
+ },
359
+ });
360
+ return;
361
+ }
362
+ if (!config.onNewUser) {
363
+ RFC7807ErrorResponse.internalError(res, 'User provisioning not configured. Set onNewUser in addPublicAuthRoutes config.', { code: 'NO_PROVISIONING', hint: 'Add onNewUser hook to addPublicAuthRoutes() config' });
364
+ return;
365
+ }
366
+ const result = await config.onNewUser(user, supabase);
367
+ if (!result) {
368
+ logger.warn({ userId: user.id, email: user.email }, 'onNewUser hook returned null');
369
+ RFC7807ErrorResponse.internalError(res, 'User provisioning failed');
370
+ return;
371
+ }
372
+ logger.info({ userId: user.id, email: user.email, organizationId: result.organizationId }, 'New user provisioned');
373
+ res.status(201).json({
374
+ success: true,
375
+ data: {
376
+ organizationId: result.organizationId,
377
+ ...result.data,
378
+ },
379
+ });
380
+ }
381
+ catch (err) {
382
+ logger.error({ err }, 'Register error');
383
+ RFC7807ErrorResponse.internalError(res, 'Internal server error');
384
+ }
385
+ });
386
+ // ── POST /logout ───────────────────────────────────────────
387
+ router.post('/logout', async (req, res) => {
388
+ const token = extractToken(req);
389
+ if (!token) {
390
+ RFC7807ErrorResponse.badRequest(res, 'No token provided');
391
+ return;
392
+ }
393
+ try {
394
+ const supabase = getSystemDB();
395
+ const { data: userData } = await supabase.auth.getUser(token);
396
+ if (userData.user) {
397
+ await supabase.auth.admin.signOut(token);
398
+ }
399
+ res.json({ success: true });
400
+ }
401
+ catch (err) {
402
+ logger.warn({ err }, 'Logout error (non-critical)');
403
+ res.json({ success: true });
404
+ }
405
+ });
406
+ // ── Invite Routes (optional) ──────────────────────────────
407
+ if (config.enableInvites) {
408
+ const invCfg = config.inviteConfig || {};
409
+ const validRoles = invCfg.validRoles || ['admin', 'member', 'viewer'];
410
+ const defaultRole = invCfg.defaultRole || 'member';
411
+ const inviteBaseUrl = invCfg.inviteBaseUrl || frontendUrl;
412
+ const invitePath = invCfg.invitePath || '/invite';
413
+ // POST /invite — Create invite (requires auth)
414
+ router.post('/invite', async (req, res) => {
415
+ const token = extractToken(req);
416
+ if (!token) {
417
+ RFC7807ErrorResponse.unauthorized(res, 'Authentication required');
418
+ return;
419
+ }
420
+ try {
421
+ const supabase = getSystemDB();
422
+ const { data: { user }, error } = await supabase.auth.getUser(token);
423
+ if (error || !user) {
424
+ RFC7807ErrorResponse.unauthorized(res, 'Invalid or expired token');
425
+ return;
426
+ }
427
+ const { organization_id, email, role } = req.body;
428
+ if (!organization_id) {
429
+ RFC7807ErrorResponse.badRequest(res, 'organization_id is required');
430
+ return;
431
+ }
432
+ const inviteRole = validRoles.includes(role) ? role : defaultRole;
433
+ // Verify user is admin of the organization
434
+ const { data: membership } = await supabase
435
+ .from('organization_members')
436
+ .select('role')
437
+ .eq('user_id', user.id)
438
+ .eq('organization_id', organization_id)
439
+ .eq('status', 'active')
440
+ .single();
441
+ if (!membership || (membership.role !== 'admin' && membership.role !== 'owner')) {
442
+ RFC7807ErrorResponse.forbidden(res, 'Only organization admins can create invites');
443
+ return;
444
+ }
445
+ // Create invite
446
+ const { data: invite, error: inviteError } = await supabase
447
+ .from('organization_invites')
448
+ .insert({
449
+ organization_id,
450
+ email: email || null,
451
+ role: inviteRole,
452
+ invited_by: user.id,
453
+ })
454
+ .select('id, token')
455
+ .single();
456
+ if (inviteError || !invite) {
457
+ logger.error({ inviteError }, 'Invite creation failed');
458
+ RFC7807ErrorResponse.internalError(res, 'Failed to create invite');
459
+ return;
460
+ }
461
+ const inviteUrl = `${inviteBaseUrl}${invitePath}/${invite.token}`;
462
+ res.status(201).json({
463
+ success: true,
464
+ data: {
465
+ invite_id: invite.id,
466
+ invite_url: inviteUrl,
467
+ token: invite.token,
468
+ },
469
+ });
470
+ }
471
+ catch (err) {
472
+ logger.error({ err }, 'Invite creation error');
473
+ RFC7807ErrorResponse.internalError(res, 'Internal server error');
474
+ }
475
+ });
476
+ // POST /invite/accept — Accept invite (requires auth)
477
+ router.post('/invite/accept', async (req, res) => {
478
+ const token = extractToken(req);
479
+ if (!token) {
480
+ RFC7807ErrorResponse.unauthorized(res, 'Authentication required. Log in first.');
481
+ return;
482
+ }
483
+ try {
484
+ const supabase = getSystemDB();
485
+ const { data: { user }, error } = await supabase.auth.getUser(token);
486
+ if (error || !user) {
487
+ RFC7807ErrorResponse.unauthorized(res, 'Invalid or expired token');
488
+ return;
489
+ }
490
+ const { invite_token } = req.body;
491
+ if (!invite_token) {
492
+ RFC7807ErrorResponse.badRequest(res, 'invite_token is required');
493
+ return;
494
+ }
495
+ // Find pending invite
496
+ const { data: invite } = await supabase
497
+ .from('organization_invites')
498
+ .select('id, organization_id, role, email, status, expires_at')
499
+ .eq('token', invite_token)
500
+ .eq('status', 'pending')
501
+ .single();
502
+ if (!invite) {
503
+ RFC7807ErrorResponse.notFound(res, 'Invite not found or already used');
504
+ return;
505
+ }
506
+ // Check expiry
507
+ if (new Date(invite.expires_at) < new Date()) {
508
+ await supabase
509
+ .from('organization_invites')
510
+ .update({ status: 'expired' })
511
+ .eq('id', invite.id);
512
+ RFC7807ErrorResponse.send(res, 410, 'gone', 'Gone', 'Invite has expired');
513
+ return;
514
+ }
515
+ // If invite is for a specific email, verify match
516
+ if (invite.email && invite.email.toLowerCase() !== (user.email || '').toLowerCase()) {
517
+ RFC7807ErrorResponse.forbidden(res, 'This invite is for a different email address');
518
+ return;
519
+ }
520
+ // Check if already a member
521
+ const { data: existing } = await supabase
522
+ .from('organization_members')
523
+ .select('id')
524
+ .eq('user_id', user.id)
525
+ .eq('organization_id', invite.organization_id)
526
+ .maybeSingle();
527
+ if (existing) {
528
+ await supabase
529
+ .from('organization_invites')
530
+ .update({ status: 'accepted', accepted_by: user.id, accepted_at: new Date().toISOString() })
531
+ .eq('id', invite.id);
532
+ res.json({ success: true, data: { message: 'Already a member of this organization' } });
533
+ return;
534
+ }
535
+ // Ensure users_public record exists
536
+ const { data: existingProfile } = await supabase
537
+ .from('users_public')
538
+ .select('id')
539
+ .eq('id', user.id)
540
+ .maybeSingle();
541
+ if (!existingProfile) {
542
+ await supabase
543
+ .from('users_public')
544
+ .insert({
545
+ id: user.id,
546
+ email: user.email || '',
547
+ active_organization_id: invite.organization_id,
548
+ is_superadmin: false,
549
+ });
550
+ }
551
+ // Add as member
552
+ const { error: memberError } = await supabase
553
+ .from('organization_members')
554
+ .insert({
555
+ organization_id: invite.organization_id,
556
+ user_id: user.id,
557
+ role: invite.role,
558
+ status: 'active',
559
+ });
560
+ if (memberError) {
561
+ logger.error({ memberError }, 'Failed to create membership from invite');
562
+ RFC7807ErrorResponse.internalError(res, 'Failed to accept invite');
563
+ return;
564
+ }
565
+ // Mark invite as accepted
566
+ await supabase
567
+ .from('organization_invites')
568
+ .update({ status: 'accepted', accepted_by: user.id, accepted_at: new Date().toISOString() })
569
+ .eq('id', invite.id);
570
+ // Get org name for response
571
+ const { data: org } = await supabase
572
+ .from('organizations')
573
+ .select('name')
574
+ .eq('id', invite.organization_id)
575
+ .single();
576
+ logger.info({ userId: user.id, organizationId: invite.organization_id }, 'Invite accepted');
577
+ res.json({
578
+ success: true,
579
+ data: {
580
+ message: `Joined ${org?.name || 'organization'} successfully`,
581
+ organization_id: invite.organization_id,
582
+ },
583
+ });
584
+ }
585
+ catch (err) {
586
+ logger.error({ err }, 'Invite accept error');
587
+ RFC7807ErrorResponse.internalError(res, 'Internal server error');
588
+ }
589
+ });
590
+ // GET /invite/:token — Get invite details (public)
591
+ router.get('/invite/:token', async (req, res) => {
592
+ try {
593
+ const supabase = getSystemDB();
594
+ const { data: invite } = await supabase
595
+ .from('organization_invites')
596
+ .select('id, organization_id, email, role, status, expires_at, organizations(name)')
597
+ .eq('token', req.params.token)
598
+ .single();
599
+ if (!invite) {
600
+ RFC7807ErrorResponse.notFound(res, 'Invite not found');
601
+ return;
602
+ }
603
+ if (invite.status !== 'pending') {
604
+ RFC7807ErrorResponse.send(res, 410, 'gone', 'Gone', 'Invite has already been used or revoked');
605
+ return;
606
+ }
607
+ if (new Date(invite.expires_at) < new Date()) {
608
+ RFC7807ErrorResponse.send(res, 410, 'gone', 'Gone', 'Invite has expired');
609
+ return;
610
+ }
611
+ const org = invite.organizations;
612
+ res.json({
613
+ success: true,
614
+ data: {
615
+ organization_name: org?.name || 'Unknown',
616
+ role: invite.role,
617
+ email: invite.email || null,
618
+ expires_at: invite.expires_at,
619
+ },
620
+ });
621
+ }
622
+ catch (err) {
623
+ logger.error({ err }, 'Invite details error');
624
+ RFC7807ErrorResponse.internalError(res, 'Internal server error');
625
+ }
626
+ });
627
+ }
628
+ }
629
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/shared/auth/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Public Auth Routes — Types
3
+ *
4
+ * Configuration for addPublicAuthRoutes().
5
+ */
6
+ import type { SupabaseClient, User as SupabaseUser } from '@supabase/supabase-js';
7
+ /**
8
+ * Result of the onNewUser hook.
9
+ * Return organization_id so the session/me endpoint knows the user's org.
10
+ */
11
+ export interface OnNewUserResult {
12
+ /** The organization ID assigned to the new user */
13
+ organizationId: string;
14
+ /** Optional: additional data to return in the register response */
15
+ data?: Record<string, unknown>;
16
+ }
17
+ /**
18
+ * OAuth provider configuration.
19
+ */
20
+ export type OAuthProvider = 'google' | 'github' | 'azure' | 'apple';
21
+ /**
22
+ * User profile returned by GET /me.
23
+ */
24
+ export interface UserProfileOrg {
25
+ id: string;
26
+ name: string;
27
+ slug?: string;
28
+ logo_url?: string | null;
29
+ role: string;
30
+ }
31
+ /**
32
+ * Invite configuration.
33
+ */
34
+ export interface InviteConfig {
35
+ /** Valid roles for invites. Default: ['admin', 'member', 'viewer'] */
36
+ validRoles?: string[];
37
+ /** Default role for new invites. Default: 'member' */
38
+ defaultRole?: string;
39
+ /** Frontend base URL for invite links. Default: process.env.FRONTEND_URL */
40
+ inviteBaseUrl?: string;
41
+ /** Frontend path for invite acceptance page. Default: '/invite' */
42
+ invitePath?: string;
43
+ }
44
+ /**
45
+ * Configuration for addPublicAuthRoutes().
46
+ */
47
+ export interface PublicAuthRoutesConfig {
48
+ /**
49
+ * Frontend URL for OAuth callback redirects.
50
+ * Default: process.env.FRONTEND_URL
51
+ */
52
+ frontendUrl?: string;
53
+ /**
54
+ * OAuth callback path on the frontend.
55
+ * Default: '/auth/callback'
56
+ */
57
+ callbackPath?: string;
58
+ /**
59
+ * Enabled OAuth providers.
60
+ * Default: ['google']
61
+ */
62
+ oauthProviders?: OAuthProvider[];
63
+ /**
64
+ * Called when a user logs in for the first time (no users_public record).
65
+ * Use this to create: organization, users_public, organization_members, default data.
66
+ *
67
+ * Receives a systemDB client (service role, bypasses RLS).
68
+ * Return { organizationId } on success, or null to skip auto-provisioning.
69
+ */
70
+ onNewUser?: (supabaseUser: SupabaseUser, systemClient: SupabaseClient) => Promise<OnNewUserResult | null>;
71
+ /**
72
+ * Enable GET /me route — user profile + organizations + role.
73
+ * Default: true
74
+ */
75
+ enableMe?: boolean;
76
+ /**
77
+ * Extra fields to select from users_public in /me.
78
+ * These are appended to the base select: 'id, email, is_superadmin, active_organization_id'.
79
+ * Example: 'name, avatar_url, language'
80
+ */
81
+ meExtraFields?: string;
82
+ /**
83
+ * Enable invite routes (POST /invite, POST /invite/accept, GET /invite/:token).
84
+ * Requires organization_invites table in your database.
85
+ * Default: false
86
+ */
87
+ enableInvites?: boolean;
88
+ /**
89
+ * Invite configuration. Only used when enableInvites is true.
90
+ */
91
+ inviteConfig?: InviteConfig;
92
+ /**
93
+ * Function to get a system-level Supabase client.
94
+ * Default: uses SUPABASE_SERVICE_ROLE_KEY from env.
95
+ */
96
+ getSystemDB?: () => SupabaseClient;
97
+ }
98
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAElF;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IAEjC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,CACV,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,cAAc,KACzB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAErC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,cAAc,CAAC;CACpC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Public Auth Routes — Types
3
+ *
4
+ * Configuration for addPublicAuthRoutes().
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/shared/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soulbatical/tetra-core",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "publishConfig": {
5
5
  "access": "restricted"
6
6
  },