hylekit 1.0.2 → 1.0.4

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 (54) hide show
  1. package/README.md +126 -59
  2. package/dist/bff/index.cjs +5 -139
  3. package/dist/bff/index.cjs.map +1 -1
  4. package/dist/bff/index.d.cts +2 -1
  5. package/dist/bff/index.d.ts +2 -1
  6. package/dist/bff/index.js +5 -145
  7. package/dist/bff/index.js.map +1 -1
  8. package/dist/client/index.cjs +58 -0
  9. package/dist/client/index.cjs.map +1 -0
  10. package/dist/client/index.d.cts +1530 -0
  11. package/dist/client/index.d.ts +1530 -0
  12. package/dist/client/index.js +31 -0
  13. package/dist/client/index.js.map +1 -0
  14. package/dist/client/nextjs.cjs +3 -214
  15. package/dist/client/nextjs.cjs.map +1 -1
  16. package/dist/client/nextjs.d.cts +4 -97
  17. package/dist/client/nextjs.d.ts +4 -97
  18. package/dist/client/nextjs.js +2 -218
  19. package/dist/client/nextjs.js.map +1 -1
  20. package/dist/client/sveltekit.cjs +3 -201
  21. package/dist/client/sveltekit.cjs.map +1 -1
  22. package/dist/client/sveltekit.d.cts +3 -72
  23. package/dist/client/sveltekit.d.ts +3 -72
  24. package/dist/client/sveltekit.js +2 -205
  25. package/dist/client/sveltekit.js.map +1 -1
  26. package/dist/{index-DYW73KK3.d.cts → index-B-5TEr94.d.cts} +28 -2
  27. package/dist/{index-DYW73KK3.d.ts → index-B-5TEr94.d.ts} +28 -2
  28. package/dist/index.cjs +276 -262
  29. package/dist/index.cjs.map +1 -1
  30. package/dist/index.d.cts +110 -3272
  31. package/dist/index.d.ts +110 -3272
  32. package/dist/index.js +270 -258
  33. package/dist/index.js.map +1 -1
  34. package/dist/server/express.cjs +71 -80
  35. package/dist/server/express.cjs.map +1 -1
  36. package/dist/server/express.d.cts +18 -6
  37. package/dist/server/express.d.ts +18 -6
  38. package/dist/server/express.js +70 -86
  39. package/dist/server/express.js.map +1 -1
  40. package/dist/server/nextjs.cjs +107 -0
  41. package/dist/server/nextjs.cjs.map +1 -0
  42. package/dist/server/nextjs.d.cts +90 -0
  43. package/dist/server/nextjs.d.ts +90 -0
  44. package/dist/server/nextjs.js +82 -0
  45. package/dist/server/nextjs.js.map +1 -0
  46. package/dist/server/sveltekit.cjs +94 -0
  47. package/dist/server/sveltekit.cjs.map +1 -0
  48. package/dist/server/sveltekit.d.cts +68 -0
  49. package/dist/server/sveltekit.d.ts +68 -0
  50. package/dist/server/sveltekit.js +69 -0
  51. package/dist/server/sveltekit.js.map +1 -0
  52. package/dist/{types-GOn9sn7-.d.ts → types-Wucl0qmN.d.cts} +1 -8
  53. package/dist/{types-BHiK1JUX.d.cts → types-Wucl0qmN.d.ts} +1 -8
  54. package/package.json +24 -7
package/README.md CHANGED
@@ -49,21 +49,52 @@ HyleKit uses a **centralized authentication database** that all your application
49
49
  npm install hylekit
50
50
  ```
51
51
 
52
- ## Environment Variables
52
+ ## Configuration
53
+
54
+ HyleKit uses a **factory pattern** - you pass configuration from your environment at initialization time. This design:
55
+ - ✅ Keeps secrets out of client bundles
56
+ - ✅ Throws runtime errors if factories are called on the client
57
+ - ✅ Gives you full control over configuration
58
+
59
+ ### Required Environment Variables
53
60
 
54
61
  ```bash
55
62
  # Turso Database
56
63
  HYLE_DATABASE_URL=libsql://[db-name]-[org].turso.io
57
64
  HYLE_DATABASE_AUTH_TOKEN=your-turso-token
58
65
 
66
+ # BetterAuth
67
+ BETTER_AUTH_URL=http://localhost:5173 # Your app's URL
68
+ BETTER_AUTH_SECRET=your-random-secret
69
+
59
70
  # Google OAuth
60
71
  GOOGLE_CLIENT_ID=your-google-client-id
61
72
  GOOGLE_CLIENT_SECRET=your-google-client-secret
73
+ ```
74
+
75
+ ### Initialize in Server-Side Code
62
76
 
63
- # App URL
64
- PUBLIC_APP_URL=http://localhost:5173 # or your production URL
77
+ ```typescript
78
+ // lib/auth.ts (server-side only!)
79
+ import { createDb, createAuth } from "hylekit";
80
+
81
+ export const db = createDb({
82
+ url: process.env.HYLE_DATABASE_URL!,
83
+ authToken: process.env.HYLE_DATABASE_AUTH_TOKEN,
84
+ });
85
+
86
+ export const auth = createAuth(db, {
87
+ baseURL: process.env.BETTER_AUTH_URL!,
88
+ secret: process.env.BETTER_AUTH_SECRET!,
89
+ google: {
90
+ clientId: process.env.GOOGLE_CLIENT_ID!,
91
+ clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
92
+ },
93
+ });
65
94
  ```
66
95
 
96
+ > ⚠️ **Security**: `createDb` and `createAuth` will throw errors if called on the client side to prevent accidental secret exposure.
97
+
67
98
  ## Architecture
68
99
 
69
100
  HyleKit supports a BFF (Backend-For-Frontend) architecture:
@@ -71,7 +102,7 @@ HyleKit supports a BFF (Backend-For-Frontend) architecture:
71
102
  ```
72
103
  ┌─────────────────────────────────────────────────────────────────┐
73
104
  │ Browser (Client FE) │
74
- │ └── Uses: hyle.client (signIn, signOut, etc.) │
105
+ │ └── Uses: hyle.client (from "hylekit/client") │
75
106
  └─────────────────────────────────┬───────────────────────────────┘
76
107
 
77
108
 
@@ -95,31 +126,52 @@ HyleKit supports a BFF (Backend-For-Frontend) architecture:
95
126
 
96
127
  ## SvelteKit Setup
97
128
 
98
- ### 1. Create Auth Route Handler
129
+ ### 1. Create Server Auth Module
99
130
 
100
- Create the auth API route to handle authentication requests:
131
+ Create your auth instance in a server-only module:
101
132
 
102
133
  ```typescript
103
- // src/routes/api/auth/[...auth]/+server.ts
104
- import hyle from "hylekit";
134
+ // src/lib/server/auth.ts
135
+ import { createDb, createAuth } from "hylekit";
136
+ import { createSvelteKitServer } from "hylekit/sveltekit";
137
+ import { env } from "$env/dynamic/private";
138
+
139
+ const db = createDb({
140
+ url: env.HYLE_DATABASE_URL,
141
+ authToken: env.HYLE_DATABASE_AUTH_TOKEN,
142
+ });
105
143
 
106
- export const { GET, POST } = hyle.server.sveltekit.handler;
144
+ const auth = createAuth(db, {
145
+ baseURL: env.PUBLIC_APP_URL,
146
+ secret: env.BETTER_AUTH_SECRET,
147
+ google: {
148
+ clientId: env.GOOGLE_CLIENT_ID,
149
+ clientSecret: env.GOOGLE_CLIENT_SECRET,
150
+ },
151
+ });
152
+
153
+ export const { handler, getSession, isAuthenticated, createHandle, makeAuthenticatedCall } = createSvelteKitServer(auth, db);
107
154
  ```
108
155
 
109
- ### 2. Add Session Hook
156
+ ### 2. Create Auth Route Handler
110
157
 
111
- Add the handle hook to populate session data in `event.locals`:
158
+ ```typescript
159
+ // src/routes/api/auth/[...auth]/+server.ts
160
+ import { handler } from "$lib/server/auth";
161
+
162
+ export const { GET, POST } = handler;
163
+ ```
164
+
165
+ ### 3. Add Session Hook
112
166
 
113
167
  ```typescript
114
168
  // src/hooks.server.ts
115
- import hyle from "hylekit";
169
+ import { createHandle } from "$lib/server/auth";
116
170
 
117
- export const handle = hyle.server.sveltekit.createHandle();
171
+ export const handle = createHandle();
118
172
  ```
119
173
 
120
- ### 3. Extend App.Locals Types
121
-
122
- Update your type definitions to include session data:
174
+ ### 4. Extend App.Locals Types
123
175
 
124
176
  ```typescript
125
177
  // src/app.d.ts
@@ -137,18 +189,14 @@ declare global {
137
189
  export {};
138
190
  ```
139
191
 
140
- ### 4. Use in Pages
141
-
142
- Access session data in your server load functions:
192
+ ### 5. Use in Pages
143
193
 
144
194
  ```typescript
145
195
  // src/routes/+page.server.ts
146
196
  import type { PageServerLoad } from "./$types";
147
197
 
148
198
  export const load: PageServerLoad = async ({ locals }) => {
149
- return {
150
- user: locals.user,
151
- };
199
+ return { user: locals.user };
152
200
  };
153
201
  ```
154
202
 
@@ -170,32 +218,50 @@ export const load: PageServerLoad = async ({ locals }) => {
170
218
 
171
219
  ## Next.js Setup (App Router)
172
220
 
173
- ### 1. Create Auth Route Handler
221
+ ### 1. Create Server Auth Module
222
+
223
+ ```typescript
224
+ // lib/auth.ts (server-side only!)
225
+ import { createDb, createAuth } from "hylekit";
226
+ import { createNextJsServer } from "hylekit/nextjs";
174
227
 
175
- Create the auth API route to handle authentication requests:
228
+ const db = createDb({
229
+ url: process.env.HYLE_DATABASE_URL!,
230
+ authToken: process.env.HYLE_DATABASE_AUTH_TOKEN,
231
+ });
232
+
233
+ const auth = createAuth(db, {
234
+ baseURL: process.env.BETTER_AUTH_URL!,
235
+ secret: process.env.BETTER_AUTH_SECRET!,
236
+ google: {
237
+ clientId: process.env.GOOGLE_CLIENT_ID!,
238
+ clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
239
+ },
240
+ });
241
+
242
+ export const { handler, getSession, isAuthenticated, getUser, makeAuthenticatedCall } = createNextJsServer(auth, db);
243
+ ```
244
+
245
+ ### 2. Create Auth Route Handler
176
246
 
177
247
  ```typescript
178
248
  // app/api/auth/[...auth]/route.ts
179
- import hyle from "hylekit";
249
+ import { handler } from "@/lib/auth";
180
250
 
181
- export const { GET, POST } = hyle.server.nextjs.handler;
251
+ export const { GET, POST } = handler;
182
252
  ```
183
253
 
184
- ### 2. Use in Server Components
185
-
186
- Access session data directly in your server components:
254
+ ### 3. Use in Server Components
187
255
 
188
256
  ```typescript
189
257
  // app/page.tsx
190
- import hyle from "hylekit";
258
+ import { getSession } from "@/lib/auth";
191
259
 
192
260
  export default async function Page() {
193
- const session = await hyle.server.nextjs.getSession();
261
+ const session = await getSession();
194
262
 
195
263
  if (!session) {
196
- return (
197
- <a href="/api/auth/sign-in/google">Sign in with Google</a>
198
- );
264
+ return <a href="/api/auth/sign-in/google">Sign in with Google</a>;
199
265
  }
200
266
 
201
267
  return (
@@ -207,24 +273,19 @@ export default async function Page() {
207
273
  }
208
274
  ```
209
275
 
210
- ### 3. Protected Routes
211
-
212
- Use the auth helpers to protect routes:
276
+ ### 4. Protected Routes
213
277
 
214
278
  ```typescript
215
279
  // app/dashboard/page.tsx
216
- import hyle from "hylekit";
280
+ import { isAuthenticated, getUser } from "@/lib/auth";
217
281
  import { redirect } from "next/navigation";
218
282
 
219
283
  export default async function DashboardPage() {
220
- const isAuth = await hyle.server.nextjs.isAuthenticated();
221
-
222
- if (!isAuth) {
284
+ if (!(await isAuthenticated())) {
223
285
  redirect("/api/auth/sign-in/google");
224
286
  }
225
287
 
226
- const user = await hyle.server.nextjs.getUser();
227
-
288
+ const user = await getUser();
228
289
  return <p>Dashboard for {user?.name}</p>;
229
290
  }
230
291
  ```
@@ -235,22 +296,25 @@ export default async function DashboardPage() {
235
296
 
236
297
  ### 1. Setup Express Middleware
237
298
 
238
- Configure the Express middleware to parse authenticated requests:
239
-
240
299
  ```typescript
241
300
  // express-app/src/app.ts
242
301
  import express from "express";
243
- import hyle from "hylekit";
302
+ import { createDb, createExpressMiddleware } from "hylekit";
244
303
 
245
304
  const app = express();
246
305
 
247
- // Option 1: Trust headers from BFF (internal calls only)
248
- app.use(hyle.server.express.middleware({
306
+ // Option 1: Trust headers from BFF (no DB needed)
307
+ app.use(createExpressMiddleware()({
249
308
  unauthenticatedRoutes: ["/health", "/public/*"],
250
309
  }));
251
310
 
252
311
  // Option 2: Verify sessions against DB (for service-to-service calls)
253
- app.use(hyle.server.express.middleware({
312
+ const db = createDb({
313
+ url: process.env.HYLE_DATABASE_URL!,
314
+ authToken: process.env.HYLE_DATABASE_AUTH_TOKEN,
315
+ });
316
+
317
+ app.use(createExpressMiddleware(db)({
254
318
  unauthenticatedRoutes: ["/health", "/public/*"],
255
319
  verifySession: true, // Checks session in Turso DB
256
320
  }));
@@ -311,13 +375,16 @@ app.post("/api/order", (req, res) => {
311
375
  Use the BFF client to make authenticated calls from your frontend backend:
312
376
 
313
377
  ```typescript
314
- // Next.js: app/api/data/route.ts
378
+ // Next.js: lib/bff.ts
315
379
  import { createNextJsBff } from "hylekit";
380
+ import { auth } from "./auth"; // Your auth instance from step 1
381
+
382
+ export const bff = createNextJsBff(auth, process.env.EXPRESS_API_URL!);
316
383
 
317
- const bff = createNextJsBff(process.env.EXPRESS_API_URL!);
384
+ // Usage in app/api/data/route.ts
385
+ import { bff } from "@/lib/bff";
318
386
 
319
387
  export async function GET() {
320
- // Session is automatically attached to the request
321
388
  const data = await bff.get("/api/profile");
322
389
  return Response.json(data);
323
390
  }
@@ -374,34 +441,34 @@ const { user, session, account, verification } = hyle.schema;
374
441
 
375
442
  The library exports a default `hyle` object containing:
376
443
 
377
- ### `hyle.server`
444
+ ### `hyle.server` (Server-Only)
378
445
 
379
- #### `hyle.server.sveltekit`
446
+ #### `hylekit/sveltekit`
380
447
  - `handler`: `{ GET, POST }` route handlers.
381
448
  - `createHandle()`: Creates a SvelteKit handle hook.
382
449
  - `getSession(event)`: Get session from request event.
383
450
  - `isAuthenticated(event)`: Check if user is authenticated.
384
451
  - `makeAuthenticatedCall(fn)`: Wrapper to ensure authentication.
385
452
 
386
- #### `hyle.server.nextjs`
453
+ #### `hylekit/nextjs`
387
454
  - `handler`: `{ GET, POST }` route handlers.
388
455
  - `getSession()`: Get session from current request headers.
389
456
  - `isAuthenticated()`: Check if user is authenticated.
390
457
  - `getUser()`: Get current user object.
391
458
  - `makeAuthenticatedCall(fn)`: Wrapper to ensure authentication.
392
459
 
393
- #### `hyle.server.express`
460
+ #### `hylekit/server/express` (or `hylekit`)
394
461
  - `middleware(options)`: Express middleware for session verification.
395
462
  - `isAuthenticated(req)`: Type guard to check if request is authenticated.
396
463
  - `getAuthContext(req)`: Get `{ user, session }` from request (throws if not authenticated).
397
464
 
398
- ### `hyle.client`
465
+ ### `hyle.client` (Client-Only)
399
466
 
400
- #### `hyle.client.sveltekit`
467
+ #### `hylekit/client` or `hylekit/client/sveltekit`
401
468
  - `login`: Alias for `signIn`.
402
469
  - All `better-auth/svelte` client methods.
403
470
 
404
- #### `hyle.client.nextjs`
471
+ #### `hylekit/client` or `hylekit/client/nextjs`
405
472
  - `login`: Alias for `signIn`.
406
473
  - All `better-auth/react` client methods.
407
474
 
@@ -68,149 +68,15 @@ var BffClientBase = class {
68
68
 
69
69
  // src/bff/nextjs.ts
70
70
  var import_headers = require("next/headers");
71
-
72
- // src/lib/auth.ts
73
- var import_better_auth = require("better-auth");
74
- var import_drizzle = require("better-auth/adapters/drizzle");
75
-
76
- // src/lib/db.ts
77
- var import_libsql = require("drizzle-orm/libsql");
78
- var import_client = require("@libsql/client");
79
-
80
- // src/lib/schema.ts
81
- var schema_exports = {};
82
- __export(schema_exports, {
83
- account: () => account,
84
- accountRelations: () => accountRelations,
85
- session: () => session,
86
- sessionRelations: () => sessionRelations,
87
- user: () => user,
88
- userRelations: () => userRelations,
89
- verification: () => verification
90
- });
91
- var import_drizzle_orm = require("drizzle-orm");
92
- var import_sqlite_core = require("drizzle-orm/sqlite-core");
93
- var user = (0, import_sqlite_core.sqliteTable)("user", {
94
- id: (0, import_sqlite_core.text)("id").primaryKey(),
95
- name: (0, import_sqlite_core.text)("name").notNull(),
96
- email: (0, import_sqlite_core.text)("email").notNull().unique(),
97
- emailVerified: (0, import_sqlite_core.integer)("email_verified", { mode: "boolean" }).default(false).notNull(),
98
- image: (0, import_sqlite_core.text)("image"),
99
- createdAt: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
100
- updatedAt: (0, import_sqlite_core.integer)("updated_at", { mode: "timestamp_ms" }).default(import_drizzle_orm.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
101
- });
102
- var session = (0, import_sqlite_core.sqliteTable)(
103
- "session",
104
- {
105
- id: (0, import_sqlite_core.text)("id").primaryKey(),
106
- expiresAt: (0, import_sqlite_core.integer)("expires_at", { mode: "timestamp_ms" }).notNull(),
107
- token: (0, import_sqlite_core.text)("token").notNull().unique(),
108
- createdAt: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
109
- updatedAt: (0, import_sqlite_core.integer)("updated_at", { mode: "timestamp_ms" }).$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
110
- ipAddress: (0, import_sqlite_core.text)("ip_address"),
111
- userAgent: (0, import_sqlite_core.text)("user_agent"),
112
- userId: (0, import_sqlite_core.text)("user_id").notNull().references(() => user.id, { onDelete: "cascade" })
113
- },
114
- (table) => [(0, import_sqlite_core.index)("session_userId_idx").on(table.userId)]
115
- );
116
- var account = (0, import_sqlite_core.sqliteTable)(
117
- "account",
118
- {
119
- id: (0, import_sqlite_core.text)("id").primaryKey(),
120
- accountId: (0, import_sqlite_core.text)("account_id").notNull(),
121
- providerId: (0, import_sqlite_core.text)("provider_id").notNull(),
122
- userId: (0, import_sqlite_core.text)("user_id").notNull().references(() => user.id, { onDelete: "cascade" }),
123
- accessToken: (0, import_sqlite_core.text)("access_token"),
124
- refreshToken: (0, import_sqlite_core.text)("refresh_token"),
125
- idToken: (0, import_sqlite_core.text)("id_token"),
126
- accessTokenExpiresAt: (0, import_sqlite_core.integer)("access_token_expires_at", {
127
- mode: "timestamp_ms"
128
- }),
129
- refreshTokenExpiresAt: (0, import_sqlite_core.integer)("refresh_token_expires_at", {
130
- mode: "timestamp_ms"
131
- }),
132
- scope: (0, import_sqlite_core.text)("scope"),
133
- password: (0, import_sqlite_core.text)("password"),
134
- createdAt: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
135
- updatedAt: (0, import_sqlite_core.integer)("updated_at", { mode: "timestamp_ms" }).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
136
- },
137
- (table) => [(0, import_sqlite_core.index)("account_userId_idx").on(table.userId)]
138
- );
139
- var verification = (0, import_sqlite_core.sqliteTable)(
140
- "verification",
141
- {
142
- id: (0, import_sqlite_core.text)("id").primaryKey(),
143
- identifier: (0, import_sqlite_core.text)("identifier").notNull(),
144
- value: (0, import_sqlite_core.text)("value").notNull(),
145
- expiresAt: (0, import_sqlite_core.integer)("expires_at", { mode: "timestamp_ms" }).notNull(),
146
- createdAt: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
147
- updatedAt: (0, import_sqlite_core.integer)("updated_at", { mode: "timestamp_ms" }).default(import_drizzle_orm.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
148
- },
149
- (table) => [(0, import_sqlite_core.index)("verification_identifier_idx").on(table.identifier)]
150
- );
151
- var userRelations = (0, import_drizzle_orm.relations)(user, ({ many }) => ({
152
- sessions: many(session),
153
- accounts: many(account)
154
- }));
155
- var sessionRelations = (0, import_drizzle_orm.relations)(session, ({ one }) => ({
156
- user: one(user, {
157
- fields: [session.userId],
158
- references: [user.id]
159
- })
160
- }));
161
- var accountRelations = (0, import_drizzle_orm.relations)(account, ({ one }) => ({
162
- user: one(user, {
163
- fields: [account.userId],
164
- references: [user.id]
165
- })
166
- }));
167
-
168
- // src/lib/db.ts
169
- var client = (0, import_client.createClient)({
170
- url: process.env.DATABASE_URL,
171
- authToken: process.env.DATABASE_AUTH_TOKEN
172
- });
173
- var db = (0, import_libsql.drizzle)(client, { schema: schema_exports });
174
-
175
- // src/lib/auth.ts
176
- var auth = (0, import_better_auth.betterAuth)({
177
- database: (0, import_drizzle.drizzleAdapter)(db, {
178
- provider: "sqlite",
179
- schema: {
180
- ...schema_exports
181
- }
182
- }),
183
- baseURL: process.env.BETTER_AUTH_URL || process.env.PUBLIC_APP_URL || process.env.NEXT_PUBLIC_APP_URL,
184
- secret: process.env.BETTER_AUTH_SECRET,
185
- trustedOrigins: process.env.TRUSTED_ORIGINS ? process.env.TRUSTED_ORIGINS.split(",") : void 0,
186
- socialProviders: {
187
- google: {
188
- clientId: process.env.GOOGLE_CLIENT_ID || "",
189
- clientSecret: process.env.GOOGLE_CLIENT_SECRET || ""
190
- }
191
- },
192
- session: {
193
- expiresIn: 60 * 60 * 24 * 7,
194
- // 7 days
195
- updateAge: 60 * 60 * 24,
196
- // Update session every 24 hours
197
- cookieCache: {
198
- enabled: true,
199
- maxAge: 60 * 5
200
- // 5 minutes
201
- }
202
- }
203
- });
204
-
205
- // src/bff/nextjs.ts
206
71
  var NextJsBffClient = class extends BffClientBase {
207
- constructor(config) {
72
+ constructor(auth, config) {
208
73
  super(config);
74
+ this.auth = auth;
209
75
  }
210
76
  async getAuthHeaders() {
211
77
  try {
212
78
  const requestHeaders = await (0, import_headers.headers)();
213
- const sessionData = await auth.api.getSession({
79
+ const sessionData = await this.auth.api.getSession({
214
80
  headers: requestHeaders
215
81
  });
216
82
  if (!sessionData) return {};
@@ -276,9 +142,9 @@ var NextJsBffClient = class extends BffClientBase {
276
142
  });
277
143
  }
278
144
  };
279
- var createNextJsBff = (baseUrlOrConfig) => {
145
+ var createNextJsBff = (auth, baseUrlOrConfig) => {
280
146
  const config = typeof baseUrlOrConfig === "string" ? { baseUrl: baseUrlOrConfig } : baseUrlOrConfig;
281
- return new NextJsBffClient(config);
147
+ return new NextJsBffClient(auth, config);
282
148
  };
283
149
 
284
150
  // src/bff/sveltekit.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bff/index.ts","../../src/bff/client.ts","../../src/bff/nextjs.ts","../../src/lib/auth.ts","../../src/lib/db.ts","../../src/lib/schema.ts","../../src/bff/sveltekit.ts"],"sourcesContent":["// Export BFF clients\nexport { createNextJsBff } from \"./nextjs\";\nexport { createSvelteKitBff } from \"./sveltekit\";\nexport type { BffClientConfig, RequestOptions } from \"./types\";\n","import type { BffClientConfig, FetchMethod, RequestOptions } from \"./types\";\n\n/**\n * Base client logic.\n */\nexport class BffClientBase {\n constructor(private config: BffClientConfig) {}\n\n protected async request<T>(\n path: string,\n method: FetchMethod,\n options: RequestOptions = {}\n ): Promise<T> {\n const url = new URL(path, this.config.baseUrl);\n \n if (options.query) {\n Object.entries(options.query).forEach(([key, value]) => {\n if (value !== undefined) {\n url.searchParams.append(key, String(value));\n }\n });\n }\n\n const headers = new Headers(options.headers || {});\n \n // Add default headers\n if (this.config.headers) {\n Object.entries(this.config.headers).forEach(([key, value]) => {\n if (!headers.has(key)) {\n headers.set(key, value);\n }\n });\n }\n\n // Set Content-Type if body is present and not FormData\n if (options.body && !(options.body instanceof FormData) && !headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n const response = await fetch(url.toString(), {\n ...options,\n method,\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`BFF Request Failed: ${response.status} ${response.statusText}`);\n }\n\n // Retrieve the Content-Type header to check if the response is JSON\n const contentType = response.headers.get(\"content-type\");\n if (contentType && contentType.includes(\"application/json\")) {\n return response.json() as Promise<T>;\n }\n \n return response.text() as unknown as Promise<T>;\n }\n}\n","import { BffClientBase } from \"./client\";\nimport type { BffClientConfig, RequestOptions } from \"./types\";\nimport { headers } from \"next/headers\";\nimport { auth } from \"../lib/auth\";\n\nexport class NextJsBffClient extends BffClientBase {\n constructor(config: BffClientConfig) {\n super(config);\n }\n\n private async getAuthHeaders(): Promise<Record<string, string>> {\n try {\n const requestHeaders = await headers();\n const sessionData = await auth.api.getSession({\n headers: requestHeaders\n });\n\n if (!sessionData) return {};\n\n return {\n \"x-hyle-user\": Buffer.from(JSON.stringify(sessionData.user)).toString(\"base64\"),\n \"x-hyle-session\": Buffer.from(JSON.stringify(sessionData.session)).toString(\"base64\")\n };\n } catch (e) {\n // Context where headers() is not available (e.g. static generation)\n return {};\n }\n }\n\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n const authHeaders = await this.getAuthHeaders();\n return this.request<T>(path, \"GET\", { \n ...options,\n headers: {\n ...options?.headers,\n ...authHeaders\n }\n });\n }\n\n async post<T>(path: string, body?: any, options?: RequestOptions): Promise<T> {\n const authHeaders = await this.getAuthHeaders();\n return this.request<T>(path, \"POST\", { \n ...options, \n body: JSON.stringify(body),\n headers: {\n ...options?.headers,\n ...authHeaders\n }\n });\n }\n\n async put<T>(path: string, body?: any, options?: RequestOptions): Promise<T> {\n const authHeaders = await this.getAuthHeaders();\n return this.request<T>(path, \"PUT\", { \n ...options, \n body: JSON.stringify(body),\n headers: {\n ...options?.headers,\n ...authHeaders\n }\n });\n }\n\n async patch<T>(path: string, body?: any, options?: RequestOptions): Promise<T> {\n const authHeaders = await this.getAuthHeaders();\n return this.request<T>(path, \"PATCH\", { \n ...options, \n body: JSON.stringify(body),\n headers: {\n ...options?.headers,\n ...authHeaders\n }\n });\n }\n\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n const authHeaders = await this.getAuthHeaders();\n return this.request<T>(path, \"DELETE\", { \n ...options,\n headers: {\n ...options?.headers,\n ...authHeaders\n }\n });\n }\n}\n\nexport const createNextJsBff = (baseUrlOrConfig: string | BffClientConfig) => {\n const config = typeof baseUrlOrConfig === \"string\" \n ? { baseUrl: baseUrlOrConfig } \n : baseUrlOrConfig;\n return new NextJsBffClient(config);\n};\n","import { betterAuth } from \"better-auth\";\nimport { drizzleAdapter } from \"better-auth/adapters/drizzle\";\nimport { db } from \"./db\";\nimport * as schema from \"./schema\";\n\nexport const auth = betterAuth({\n database: drizzleAdapter(db, {\n provider: \"sqlite\",\n schema: {\n ...schema\n }\n }),\n baseURL: process.env.BETTER_AUTH_URL || process.env.PUBLIC_APP_URL || process.env.NEXT_PUBLIC_APP_URL,\n secret: process.env.BETTER_AUTH_SECRET,\n trustedOrigins: process.env.TRUSTED_ORIGINS ? process.env.TRUSTED_ORIGINS.split(\",\") : undefined,\n socialProviders: {\n google: {\n clientId: process.env.GOOGLE_CLIENT_ID || \"\",\n clientSecret: process.env.GOOGLE_CLIENT_SECRET || \"\",\n },\n },\n session: {\n expiresIn: 60 * 60 * 24 * 7, // 7 days\n updateAge: 60 * 60 * 24, // Update session every 24 hours\n cookieCache: {\n enabled: true,\n maxAge: 60 * 5, // 5 minutes\n },\n },\n});\n","import { drizzle } from \"drizzle-orm/libsql\";\nimport { createClient } from \"@libsql/client\";\nimport * as schema from \"./schema\";\n\nconst client = createClient({\n url: process.env.DATABASE_URL!,\n authToken: process.env.DATABASE_AUTH_TOKEN!,\n});\n\nexport const db = drizzle(client, { schema });\n","import { relations, sql } from \"drizzle-orm\";\nimport { sqliteTable, text, integer, index } from \"drizzle-orm/sqlite-core\";\n\nexport const user = sqliteTable(\"user\", {\n id: text(\"id\").primaryKey(),\n name: text(\"name\").notNull(),\n email: text(\"email\").notNull().unique(),\n emailVerified: integer(\"email_verified\", { mode: \"boolean\" })\n .default(false)\n .notNull(),\n image: text(\"image\"),\n createdAt: integer(\"created_at\", { mode: \"timestamp_ms\" })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n updatedAt: integer(\"updated_at\", { mode: \"timestamp_ms\" })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n});\n\nexport const session = sqliteTable(\n \"session\",\n {\n id: text(\"id\").primaryKey(),\n expiresAt: integer(\"expires_at\", { mode: \"timestamp_ms\" }).notNull(),\n token: text(\"token\").notNull().unique(),\n createdAt: integer(\"created_at\", { mode: \"timestamp_ms\" })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n updatedAt: integer(\"updated_at\", { mode: \"timestamp_ms\" })\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n ipAddress: text(\"ip_address\"),\n userAgent: text(\"user_agent\"),\n userId: text(\"user_id\")\n .notNull()\n .references(() => user.id, { onDelete: \"cascade\" }),\n },\n (table) => [index(\"session_userId_idx\").on(table.userId)],\n);\n\nexport const account = sqliteTable(\n \"account\",\n {\n id: text(\"id\").primaryKey(),\n accountId: text(\"account_id\").notNull(),\n providerId: text(\"provider_id\").notNull(),\n userId: text(\"user_id\")\n .notNull()\n .references(() => user.id, { onDelete: \"cascade\" }),\n accessToken: text(\"access_token\"),\n refreshToken: text(\"refresh_token\"),\n idToken: text(\"id_token\"),\n accessTokenExpiresAt: integer(\"access_token_expires_at\", {\n mode: \"timestamp_ms\",\n }),\n refreshTokenExpiresAt: integer(\"refresh_token_expires_at\", {\n mode: \"timestamp_ms\",\n }),\n scope: text(\"scope\"),\n password: text(\"password\"),\n createdAt: integer(\"created_at\", { mode: \"timestamp_ms\" })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n updatedAt: integer(\"updated_at\", { mode: \"timestamp_ms\" })\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n },\n (table) => [index(\"account_userId_idx\").on(table.userId)],\n);\n\nexport const verification = sqliteTable(\n \"verification\",\n {\n id: text(\"id\").primaryKey(),\n identifier: text(\"identifier\").notNull(),\n value: text(\"value\").notNull(),\n expiresAt: integer(\"expires_at\", { mode: \"timestamp_ms\" }).notNull(),\n createdAt: integer(\"created_at\", { mode: \"timestamp_ms\" })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n updatedAt: integer(\"updated_at\", { mode: \"timestamp_ms\" })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => /* @__PURE__ */ new Date())\n .notNull(),\n },\n (table) => [index(\"verification_identifier_idx\").on(table.identifier)],\n);\n\nexport const userRelations = relations(user, ({ many }) => ({\n sessions: many(session),\n accounts: many(account),\n}));\n\nexport const sessionRelations = relations(session, ({ one }) => ({\n user: one(user, {\n fields: [session.userId],\n references: [user.id],\n }),\n}));\n\nexport const accountRelations = relations(account, ({ one }) => ({\n user: one(user, {\n fields: [account.userId],\n references: [user.id],\n }),\n}));\n","import { BffClientBase } from \"./client\";\nimport type { BffClientConfig, RequestOptions } from \"./types\";\nimport type { RequestEvent } from \"@sveltejs/kit\";\n\nexport class SvelteKitBffClient extends BffClientBase {\n constructor(config: BffClientConfig) {\n super(config);\n }\n\n /**\n * Creates a request context bound to a specific SvelteKit event.\n * This is necessary because SvelteKit doesn't have global request storage.\n */\n with(event: RequestEvent) {\n // Extract token from locals if available (set by our handle hook)\n // or try to get it from session.\n const sessionData = (event.locals as any).session;\n let authHeaders: Record<string, string> = {};\n\n if (sessionData?.user && sessionData?.session) {\n authHeaders = {\n \"x-hyle-user\": Buffer.from(JSON.stringify(sessionData.user)).toString(\"base64\"),\n \"x-hyle-session\": Buffer.from(JSON.stringify(sessionData.session)).toString(\"base64\")\n };\n }\n\n return {\n get: <T>(path: string, options?: RequestOptions) => \n this.request<T>(path, \"GET\", {\n ...options,\n headers: { ...options?.headers, ...authHeaders }\n }),\n \n post: <T>(path: string, body?: any, options?: RequestOptions) => \n this.request<T>(path, \"POST\", { \n ...options, \n body: JSON.stringify(body),\n headers: { ...options?.headers, ...authHeaders }\n }),\n\n put: <T>(path: string, body?: any, options?: RequestOptions) => \n this.request<T>(path, \"PUT\", { \n ...options, \n body: JSON.stringify(body),\n headers: { ...options?.headers, ...authHeaders }\n }),\n\n patch: <T>(path: string, body?: any, options?: RequestOptions) => \n this.request<T>(path, \"PATCH\", { \n ...options, \n body: JSON.stringify(body),\n headers: { ...options?.headers, ...authHeaders }\n }),\n\n delete: <T>(path: string, options?: RequestOptions) => \n this.request<T>(path, \"DELETE\", {\n ...options,\n headers: { ...options?.headers, ...authHeaders }\n }),\n };\n }\n}\n\nexport const createSvelteKitBff = (baseUrlOrConfig: string | BffClientConfig) => {\n const config = typeof baseUrlOrConfig === \"string\" \n ? { baseUrl: baseUrlOrConfig } \n : baseUrlOrConfig;\n return new SvelteKitBffClient(config);\n};\n"],"mappings":"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","names":["headers"]}
1
+ {"version":3,"sources":["../../src/bff/index.ts","../../src/bff/client.ts","../../src/bff/nextjs.ts","../../src/bff/sveltekit.ts"],"sourcesContent":["// Export BFF clients\nexport { createNextJsBff } from \"./nextjs\";\nexport { createSvelteKitBff } from \"./sveltekit\";\nexport type { BffClientConfig, RequestOptions } from \"./types\";\n","import type { BffClientConfig, FetchMethod, RequestOptions } from \"./types\";\n\n/**\n * Base client logic.\n */\nexport class BffClientBase {\n constructor(private config: BffClientConfig) {}\n\n protected async request<T>(\n path: string,\n method: FetchMethod,\n options: RequestOptions = {}\n ): Promise<T> {\n const url = new URL(path, this.config.baseUrl);\n \n if (options.query) {\n Object.entries(options.query).forEach(([key, value]) => {\n if (value !== undefined) {\n url.searchParams.append(key, String(value));\n }\n });\n }\n\n const headers = new Headers(options.headers || {});\n \n // Add default headers\n if (this.config.headers) {\n Object.entries(this.config.headers).forEach(([key, value]) => {\n if (!headers.has(key)) {\n headers.set(key, value);\n }\n });\n }\n\n // Set Content-Type if body is present and not FormData\n if (options.body && !(options.body instanceof FormData) && !headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n const response = await fetch(url.toString(), {\n ...options,\n method,\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`BFF Request Failed: ${response.status} ${response.statusText}`);\n }\n\n // Retrieve the Content-Type header to check if the response is JSON\n const contentType = response.headers.get(\"content-type\");\n if (contentType && contentType.includes(\"application/json\")) {\n return response.json() as Promise<T>;\n }\n \n return response.text() as unknown as Promise<T>;\n }\n}\n","import { BffClientBase } from \"./client\";\nimport type { BffClientConfig, RequestOptions } from \"./types\";\nimport { headers } from \"next/headers\";\n\n// Type for auth instance created by createAuth\ntype HyleAuth = ReturnType<typeof import(\"better-auth\").betterAuth>;\n\n/**\n * Next.js BFF Client that requires an auth instance.\n */\nexport class NextJsBffClient extends BffClientBase {\n private auth: HyleAuth;\n\n constructor(auth: HyleAuth, config: BffClientConfig) {\n super(config);\n this.auth = auth;\n }\n\n private async getAuthHeaders(): Promise<Record<string, string>> {\n try {\n const requestHeaders = await headers();\n const sessionData = await this.auth.api.getSession({\n headers: requestHeaders\n });\n\n if (!sessionData) return {};\n\n return {\n \"x-hyle-user\": Buffer.from(JSON.stringify(sessionData.user)).toString(\"base64\"),\n \"x-hyle-session\": Buffer.from(JSON.stringify(sessionData.session)).toString(\"base64\")\n };\n } catch (e) {\n // Context where headers() is not available (e.g. static generation)\n return {};\n }\n }\n\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n const authHeaders = await this.getAuthHeaders();\n return this.request<T>(path, \"GET\", {\n ...options,\n headers: {\n ...options?.headers,\n ...authHeaders\n }\n });\n }\n\n async post<T>(path: string, body?: any, options?: RequestOptions): Promise<T> {\n const authHeaders = await this.getAuthHeaders();\n return this.request<T>(path, \"POST\", {\n ...options,\n body: JSON.stringify(body),\n headers: {\n ...options?.headers,\n ...authHeaders\n }\n });\n }\n\n async put<T>(path: string, body?: any, options?: RequestOptions): Promise<T> {\n const authHeaders = await this.getAuthHeaders();\n return this.request<T>(path, \"PUT\", {\n ...options,\n body: JSON.stringify(body),\n headers: {\n ...options?.headers,\n ...authHeaders\n }\n });\n }\n\n async patch<T>(path: string, body?: any, options?: RequestOptions): Promise<T> {\n const authHeaders = await this.getAuthHeaders();\n return this.request<T>(path, \"PATCH\", {\n ...options,\n body: JSON.stringify(body),\n headers: {\n ...options?.headers,\n ...authHeaders\n }\n });\n }\n\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n const authHeaders = await this.getAuthHeaders();\n return this.request<T>(path, \"DELETE\", {\n ...options,\n headers: {\n ...options?.headers,\n ...authHeaders\n }\n });\n }\n}\n\n/**\n * Creates a Next.js BFF client for making authenticated requests to your Express API.\n * \n * @param auth - Auth instance created by createAuth()\n * @param baseUrlOrConfig - Base URL string or full config object\n * \n * @example\n * ```typescript\n * // In lib/bff.ts\n * import { createDb, createAuth, createNextJsBff } from \"hylekit\";\n * \n * const db = createDb({ url: process.env.HYLE_DATABASE_URL!, authToken: process.env.HYLE_DATABASE_AUTH_TOKEN });\n * const auth = createAuth(db, { ... });\n * \n * export const bff = createNextJsBff(auth, process.env.EXPRESS_API_URL!);\n * \n * // Usage in server components\n * const data = await bff.get(\"/api/data\");\n * ```\n */\nexport const createNextJsBff = (auth: HyleAuth, baseUrlOrConfig: string | BffClientConfig) => {\n const config = typeof baseUrlOrConfig === \"string\"\n ? { baseUrl: baseUrlOrConfig }\n : baseUrlOrConfig;\n return new NextJsBffClient(auth, config);\n};\n","import { BffClientBase } from \"./client\";\nimport type { BffClientConfig, RequestOptions } from \"./types\";\nimport type { RequestEvent } from \"@sveltejs/kit\";\n\nexport class SvelteKitBffClient extends BffClientBase {\n constructor(config: BffClientConfig) {\n super(config);\n }\n\n /**\n * Creates a request context bound to a specific SvelteKit event.\n * This is necessary because SvelteKit doesn't have global request storage.\n */\n with(event: RequestEvent) {\n // Extract token from locals if available (set by our handle hook)\n // or try to get it from session.\n const sessionData = (event.locals as any).session;\n let authHeaders: Record<string, string> = {};\n\n if (sessionData?.user && sessionData?.session) {\n authHeaders = {\n \"x-hyle-user\": Buffer.from(JSON.stringify(sessionData.user)).toString(\"base64\"),\n \"x-hyle-session\": Buffer.from(JSON.stringify(sessionData.session)).toString(\"base64\")\n };\n }\n\n return {\n get: <T>(path: string, options?: RequestOptions) => \n this.request<T>(path, \"GET\", {\n ...options,\n headers: { ...options?.headers, ...authHeaders }\n }),\n \n post: <T>(path: string, body?: any, options?: RequestOptions) => \n this.request<T>(path, \"POST\", { \n ...options, \n body: JSON.stringify(body),\n headers: { ...options?.headers, ...authHeaders }\n }),\n\n put: <T>(path: string, body?: any, options?: RequestOptions) => \n this.request<T>(path, \"PUT\", { \n ...options, \n body: JSON.stringify(body),\n headers: { ...options?.headers, ...authHeaders }\n }),\n\n patch: <T>(path: string, body?: any, options?: RequestOptions) => \n this.request<T>(path, \"PATCH\", { \n ...options, \n body: JSON.stringify(body),\n headers: { ...options?.headers, ...authHeaders }\n }),\n\n delete: <T>(path: string, options?: RequestOptions) => \n this.request<T>(path, \"DELETE\", {\n ...options,\n headers: { ...options?.headers, ...authHeaders }\n }),\n };\n }\n}\n\nexport const createSvelteKitBff = (baseUrlOrConfig: string | BffClientConfig) => {\n const config = typeof baseUrlOrConfig === \"string\" \n ? { baseUrl: baseUrlOrConfig } \n : baseUrlOrConfig;\n return new SvelteKitBffClient(config);\n};\n"],"mappings":"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","names":["headers"]}
@@ -1,2 +1,3 @@
1
- export { B as BffClientConfig, R as RequestOptions, c as createNextJsBff, a as createSvelteKitBff } from '../index-DYW73KK3.cjs';
1
+ export { B as BffClientConfig, R as RequestOptions, c as createNextJsBff, a as createSvelteKitBff } from '../index-B-5TEr94.cjs';
2
+ import 'better-auth';
2
3
  import '@sveltejs/kit';
@@ -1,2 +1,3 @@
1
- export { B as BffClientConfig, R as RequestOptions, c as createNextJsBff, a as createSvelteKitBff } from '../index-DYW73KK3.js';
1
+ export { B as BffClientConfig, R as RequestOptions, c as createNextJsBff, a as createSvelteKitBff } from '../index-B-5TEr94.js';
2
+ import 'better-auth';
2
3
  import '@sveltejs/kit';