@terreno/api 0.0.18 → 0.2.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 (71) hide show
  1. package/README.md +73 -3
  2. package/dist/api.d.ts +96 -3
  3. package/dist/api.js +159 -11
  4. package/dist/api.test.js +906 -2
  5. package/dist/auth.js +3 -1
  6. package/dist/betterAuth.d.ts +91 -0
  7. package/dist/betterAuth.js +8 -0
  8. package/dist/betterAuth.test.d.ts +1 -0
  9. package/dist/betterAuth.test.js +181 -0
  10. package/dist/betterAuthApp.d.ts +22 -0
  11. package/dist/betterAuthApp.js +38 -0
  12. package/dist/betterAuthApp.test.d.ts +1 -0
  13. package/dist/betterAuthApp.test.js +242 -0
  14. package/dist/betterAuthSetup.d.ts +60 -0
  15. package/dist/betterAuthSetup.js +278 -0
  16. package/dist/betterAuthSetup.test.d.ts +1 -0
  17. package/dist/betterAuthSetup.test.js +684 -0
  18. package/dist/errors.js +14 -11
  19. package/dist/example.js +7 -7
  20. package/dist/expressServer.js +2 -2
  21. package/dist/githubAuth.test.js +3 -3
  22. package/dist/index.d.ts +6 -0
  23. package/dist/index.js +6 -0
  24. package/dist/openApi.test.js +8 -5
  25. package/dist/openApiBuilder.d.ts +69 -1
  26. package/dist/openApiBuilder.js +109 -5
  27. package/dist/openApiValidator.d.ts +296 -0
  28. package/dist/openApiValidator.js +698 -0
  29. package/dist/openApiValidator.test.d.ts +1 -0
  30. package/dist/openApiValidator.test.js +346 -0
  31. package/dist/plugins.test.js +3 -3
  32. package/dist/terrenoApp.d.ts +189 -0
  33. package/dist/terrenoApp.js +352 -0
  34. package/dist/terrenoApp.test.d.ts +1 -0
  35. package/dist/terrenoApp.test.js +264 -0
  36. package/dist/terrenoPlugin.d.ts +38 -0
  37. package/dist/terrenoPlugin.js +2 -0
  38. package/dist/tests.js +34 -24
  39. package/package.json +8 -2
  40. package/src/__snapshots__/openApi.test.ts.snap +399 -0
  41. package/src/__snapshots__/openApiBuilder.test.ts.snap +108 -0
  42. package/src/api.test.ts +743 -2
  43. package/src/api.ts +270 -6
  44. package/src/auth.ts +3 -1
  45. package/src/betterAuth.test.ts +160 -0
  46. package/src/betterAuth.ts +104 -0
  47. package/src/betterAuthApp.test.ts +114 -0
  48. package/src/betterAuthApp.ts +60 -0
  49. package/src/betterAuthSetup.test.ts +485 -0
  50. package/src/betterAuthSetup.ts +251 -0
  51. package/src/errors.ts +14 -11
  52. package/src/example.ts +7 -7
  53. package/src/expressServer.ts +4 -5
  54. package/src/githubAuth.test.ts +3 -3
  55. package/src/index.ts +6 -0
  56. package/src/openApi.test.ts +8 -5
  57. package/src/openApiBuilder.ts +188 -15
  58. package/src/openApiValidator.test.ts +241 -0
  59. package/src/openApiValidator.ts +860 -0
  60. package/src/plugins.test.ts +3 -3
  61. package/src/terrenoApp.test.ts +201 -0
  62. package/src/terrenoApp.ts +347 -0
  63. package/src/terrenoPlugin.ts +39 -0
  64. package/src/tests.ts +34 -24
  65. package/.cursorrules +0 -107
  66. package/.windsurfrules +0 -107
  67. package/AGENTS.md +0 -313
  68. package/dist/response.d.ts +0 -0
  69. package/dist/response.js +0 -1
  70. package/index.ts +0 -1
  71. package/src/response.ts +0 -0
@@ -0,0 +1,684 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
47
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
48
+ return new (P || (P = Promise))(function (resolve, reject) {
49
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
50
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
51
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
52
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
53
+ });
54
+ };
55
+ var __generator = (this && this.__generator) || function (thisArg, body) {
56
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
57
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
58
+ function verb(n) { return function (v) { return step([n, v]); }; }
59
+ function step(op) {
60
+ if (f) throw new TypeError("Generator is already executing.");
61
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
62
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
63
+ if (y = 0, t) op = [op[0] & 2, t.value];
64
+ switch (op[0]) {
65
+ case 0: case 1: t = op; break;
66
+ case 4: _.label++; return { value: op[1], done: false };
67
+ case 5: _.label++; y = op[1]; op = [0]; continue;
68
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
69
+ default:
70
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
71
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
72
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
73
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
74
+ if (t[2]) _.ops.pop();
75
+ _.trys.pop(); continue;
76
+ }
77
+ op = body.call(thisArg, _);
78
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
79
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
80
+ }
81
+ };
82
+ var __importDefault = (this && this.__importDefault) || function (mod) {
83
+ return (mod && mod.__esModule) ? mod : { "default": mod };
84
+ };
85
+ Object.defineProperty(exports, "__esModule", { value: true });
86
+ var bun_test_1 = require("bun:test");
87
+ var express_1 = __importDefault(require("express"));
88
+ var mongodb_memory_server_1 = require("mongodb-memory-server");
89
+ var mongoose_1 = __importStar(require("mongoose"));
90
+ var betterAuthSetup_1 = require("./betterAuthSetup");
91
+ // Use a separate connection to avoid conflict with bunSetup.ts preload
92
+ var conn;
93
+ var mongod;
94
+ var TestUser;
95
+ // Simple user schema for testing
96
+ var testUserSchema = new mongoose_1.Schema({
97
+ admin: { default: false, type: Boolean },
98
+ betterAuthId: { type: String },
99
+ email: { required: true, type: String },
100
+ name: { type: String },
101
+ oauthProvider: { type: String },
102
+ });
103
+ // Start memory server and create connection before tests run
104
+ var setup = (function () { return __awaiter(void 0, void 0, void 0, function () {
105
+ return __generator(this, function (_a) {
106
+ switch (_a.label) {
107
+ case 0: return [4 /*yield*/, mongodb_memory_server_1.MongoMemoryServer.create()];
108
+ case 1:
109
+ mongod = _a.sent();
110
+ conn = mongoose_1.default.createConnection(mongod.getUri());
111
+ return [4 /*yield*/, conn.asPromise()];
112
+ case 2:
113
+ _a.sent();
114
+ TestUser = conn.model("BetterAuthTestUser", testUserSchema);
115
+ return [2 /*return*/];
116
+ }
117
+ });
118
+ }); })();
119
+ // Helper to get the mongo client from our separate connection
120
+ var getClient = function () { return conn.client; };
121
+ (0, bun_test_1.afterAll)(function () { return __awaiter(void 0, void 0, void 0, function () {
122
+ return __generator(this, function (_a) {
123
+ switch (_a.label) {
124
+ case 0: return [4 /*yield*/, (conn === null || conn === void 0 ? void 0 : conn.close())];
125
+ case 1:
126
+ _a.sent();
127
+ return [4 /*yield*/, (mongod === null || mongod === void 0 ? void 0 : mongod.stop())];
128
+ case 2:
129
+ _a.sent();
130
+ return [2 /*return*/];
131
+ }
132
+ });
133
+ }); });
134
+ (0, bun_test_1.afterEach)(function () { return __awaiter(void 0, void 0, void 0, function () {
135
+ return __generator(this, function (_a) {
136
+ switch (_a.label) {
137
+ case 0: return [4 /*yield*/, setup];
138
+ case 1:
139
+ _a.sent();
140
+ return [4 /*yield*/, TestUser.deleteMany({})];
141
+ case 2:
142
+ _a.sent();
143
+ return [2 /*return*/];
144
+ }
145
+ });
146
+ }); });
147
+ (0, bun_test_1.describe)("createBetterAuth", function () {
148
+ (0, bun_test_1.it)("throws if secret is not provided", function () { return __awaiter(void 0, void 0, void 0, function () {
149
+ var originalSecret, config;
150
+ return __generator(this, function (_a) {
151
+ switch (_a.label) {
152
+ case 0: return [4 /*yield*/, setup];
153
+ case 1:
154
+ _a.sent();
155
+ originalSecret = process.env.BETTER_AUTH_SECRET;
156
+ delete process.env.BETTER_AUTH_SECRET;
157
+ config = {
158
+ baseURL: "http://localhost:3000",
159
+ enabled: true,
160
+ };
161
+ (0, bun_test_1.expect)(function () { return (0, betterAuthSetup_1.createBetterAuth)({ config: config, mongoClient: getClient() }); }).toThrow("BETTER_AUTH_SECRET must be set");
162
+ process.env.BETTER_AUTH_SECRET = originalSecret;
163
+ return [2 /*return*/];
164
+ }
165
+ });
166
+ }); });
167
+ (0, bun_test_1.it)("throws if baseURL is not provided", function () { return __awaiter(void 0, void 0, void 0, function () {
168
+ var originalUrl, config;
169
+ return __generator(this, function (_a) {
170
+ switch (_a.label) {
171
+ case 0: return [4 /*yield*/, setup];
172
+ case 1:
173
+ _a.sent();
174
+ originalUrl = process.env.BETTER_AUTH_URL;
175
+ delete process.env.BETTER_AUTH_URL;
176
+ config = {
177
+ enabled: true,
178
+ secret: "test-secret-at-least-32-characters-long",
179
+ };
180
+ (0, bun_test_1.expect)(function () { return (0, betterAuthSetup_1.createBetterAuth)({ config: config, mongoClient: getClient() }); }).toThrow("BETTER_AUTH_URL must be set");
181
+ process.env.BETTER_AUTH_URL = originalUrl;
182
+ return [2 /*return*/];
183
+ }
184
+ });
185
+ }); });
186
+ (0, bun_test_1.it)("creates a Better Auth instance with valid config", function () { return __awaiter(void 0, void 0, void 0, function () {
187
+ var config, auth;
188
+ return __generator(this, function (_a) {
189
+ switch (_a.label) {
190
+ case 0: return [4 /*yield*/, setup];
191
+ case 1:
192
+ _a.sent();
193
+ config = {
194
+ baseURL: "http://localhost:3000",
195
+ enabled: true,
196
+ secret: "test-secret-at-least-32-characters-long",
197
+ };
198
+ auth = (0, betterAuthSetup_1.createBetterAuth)({ config: config, mongoClient: getClient() });
199
+ (0, bun_test_1.expect)(auth).toBeDefined();
200
+ (0, bun_test_1.expect)(auth.api).toBeDefined();
201
+ return [2 /*return*/];
202
+ }
203
+ });
204
+ }); });
205
+ (0, bun_test_1.it)("creates instance with social providers", function () { return __awaiter(void 0, void 0, void 0, function () {
206
+ var config, auth;
207
+ return __generator(this, function (_a) {
208
+ switch (_a.label) {
209
+ case 0: return [4 /*yield*/, setup];
210
+ case 1:
211
+ _a.sent();
212
+ config = {
213
+ appleOAuth: { clientId: "apple-id", clientSecret: "apple-secret" },
214
+ baseURL: "http://localhost:3000",
215
+ enabled: true,
216
+ githubOAuth: { clientId: "github-id", clientSecret: "github-secret" },
217
+ googleOAuth: { clientId: "google-id", clientSecret: "google-secret" },
218
+ secret: "test-secret-at-least-32-characters-long",
219
+ };
220
+ auth = (0, betterAuthSetup_1.createBetterAuth)({ config: config, mongoClient: getClient() });
221
+ (0, bun_test_1.expect)(auth).toBeDefined();
222
+ return [2 /*return*/];
223
+ }
224
+ });
225
+ }); });
226
+ (0, bun_test_1.it)("uses env vars as fallback for secret and baseURL", function () { return __awaiter(void 0, void 0, void 0, function () {
227
+ var config, auth;
228
+ return __generator(this, function (_a) {
229
+ switch (_a.label) {
230
+ case 0: return [4 /*yield*/, setup];
231
+ case 1:
232
+ _a.sent();
233
+ process.env.BETTER_AUTH_SECRET = "env-secret-at-least-32-characters-long";
234
+ process.env.BETTER_AUTH_URL = "http://localhost:4000";
235
+ config = { enabled: true };
236
+ auth = (0, betterAuthSetup_1.createBetterAuth)({ config: config, mongoClient: getClient() });
237
+ (0, bun_test_1.expect)(auth).toBeDefined();
238
+ delete process.env.BETTER_AUTH_SECRET;
239
+ delete process.env.BETTER_AUTH_URL;
240
+ return [2 /*return*/];
241
+ }
242
+ });
243
+ }); });
244
+ (0, bun_test_1.it)("uses custom basePath when provided", function () { return __awaiter(void 0, void 0, void 0, function () {
245
+ var config, auth;
246
+ return __generator(this, function (_a) {
247
+ switch (_a.label) {
248
+ case 0: return [4 /*yield*/, setup];
249
+ case 1:
250
+ _a.sent();
251
+ config = {
252
+ basePath: "/custom/auth",
253
+ baseURL: "http://localhost:3000",
254
+ enabled: true,
255
+ secret: "test-secret-at-least-32-characters-long",
256
+ };
257
+ auth = (0, betterAuthSetup_1.createBetterAuth)({ config: config, mongoClient: getClient() });
258
+ (0, bun_test_1.expect)(auth).toBeDefined();
259
+ return [2 /*return*/];
260
+ }
261
+ });
262
+ }); });
263
+ });
264
+ (0, bun_test_1.describe)("syncBetterAuthUser", function () {
265
+ var makeBetterAuthUser = function (overrides) {
266
+ if (overrides === void 0) { overrides = {}; }
267
+ return (__assign({ createdAt: new Date(), email: "test@example.com", emailVerified: true, id: "ba-user-123", image: null, name: "Test User", updatedAt: new Date() }, overrides));
268
+ };
269
+ (0, bun_test_1.it)("creates a new user when none exists", function () { return __awaiter(void 0, void 0, void 0, function () {
270
+ var baUser, result;
271
+ return __generator(this, function (_a) {
272
+ switch (_a.label) {
273
+ case 0: return [4 /*yield*/, setup];
274
+ case 1:
275
+ _a.sent();
276
+ baUser = makeBetterAuthUser();
277
+ return [4 /*yield*/, (0, betterAuthSetup_1.syncBetterAuthUser)(TestUser, baUser)];
278
+ case 2:
279
+ result = _a.sent();
280
+ (0, bun_test_1.expect)(result).toBeDefined();
281
+ (0, bun_test_1.expect)(result.email).toBe("test@example.com");
282
+ (0, bun_test_1.expect)(result.name).toBe("Test User");
283
+ (0, bun_test_1.expect)(result.betterAuthId).toBe("ba-user-123");
284
+ (0, bun_test_1.expect)(result.admin).toBe(false);
285
+ return [2 /*return*/];
286
+ }
287
+ });
288
+ }); });
289
+ (0, bun_test_1.it)("updates an existing user matched by betterAuthId", function () { return __awaiter(void 0, void 0, void 0, function () {
290
+ var baUser, result, count;
291
+ return __generator(this, function (_a) {
292
+ switch (_a.label) {
293
+ case 0: return [4 /*yield*/, setup];
294
+ case 1:
295
+ _a.sent();
296
+ return [4 /*yield*/, TestUser.create({
297
+ betterAuthId: "ba-user-123",
298
+ email: "old@example.com",
299
+ name: "Old Name",
300
+ })];
301
+ case 2:
302
+ _a.sent();
303
+ baUser = makeBetterAuthUser({ email: "new@example.com", name: "New Name" });
304
+ return [4 /*yield*/, (0, betterAuthSetup_1.syncBetterAuthUser)(TestUser, baUser)];
305
+ case 3:
306
+ result = _a.sent();
307
+ (0, bun_test_1.expect)(result.email).toBe("new@example.com");
308
+ (0, bun_test_1.expect)(result.name).toBe("New Name");
309
+ (0, bun_test_1.expect)(result.betterAuthId).toBe("ba-user-123");
310
+ return [4 /*yield*/, TestUser.countDocuments()];
311
+ case 4:
312
+ count = _a.sent();
313
+ (0, bun_test_1.expect)(count).toBe(1);
314
+ return [2 /*return*/];
315
+ }
316
+ });
317
+ }); });
318
+ (0, bun_test_1.it)("links existing user matched by email", function () { return __awaiter(void 0, void 0, void 0, function () {
319
+ var baUser, result, count;
320
+ return __generator(this, function (_a) {
321
+ switch (_a.label) {
322
+ case 0: return [4 /*yield*/, setup];
323
+ case 1:
324
+ _a.sent();
325
+ return [4 /*yield*/, TestUser.create({
326
+ email: "test@example.com",
327
+ name: "Existing User",
328
+ })];
329
+ case 2:
330
+ _a.sent();
331
+ baUser = makeBetterAuthUser();
332
+ return [4 /*yield*/, (0, betterAuthSetup_1.syncBetterAuthUser)(TestUser, baUser)];
333
+ case 3:
334
+ result = _a.sent();
335
+ (0, bun_test_1.expect)(result.betterAuthId).toBe("ba-user-123");
336
+ (0, bun_test_1.expect)(result.email).toBe("test@example.com");
337
+ return [4 /*yield*/, TestUser.countDocuments()];
338
+ case 4:
339
+ count = _a.sent();
340
+ (0, bun_test_1.expect)(count).toBe(1);
341
+ return [2 /*return*/];
342
+ }
343
+ });
344
+ }); });
345
+ (0, bun_test_1.it)("sets oauthProvider when linking by email", function () { return __awaiter(void 0, void 0, void 0, function () {
346
+ var baUser, result;
347
+ return __generator(this, function (_a) {
348
+ switch (_a.label) {
349
+ case 0: return [4 /*yield*/, setup];
350
+ case 1:
351
+ _a.sent();
352
+ return [4 /*yield*/, TestUser.create({
353
+ email: "test@example.com",
354
+ name: "Existing User",
355
+ })];
356
+ case 2:
357
+ _a.sent();
358
+ baUser = makeBetterAuthUser();
359
+ return [4 /*yield*/, (0, betterAuthSetup_1.syncBetterAuthUser)(TestUser, baUser, "google")];
360
+ case 3:
361
+ result = _a.sent();
362
+ (0, bun_test_1.expect)(result.oauthProvider).toBe("google");
363
+ return [2 /*return*/];
364
+ }
365
+ });
366
+ }); });
367
+ (0, bun_test_1.it)("uses email prefix as name when name is null", function () { return __awaiter(void 0, void 0, void 0, function () {
368
+ var baUser, result;
369
+ return __generator(this, function (_a) {
370
+ switch (_a.label) {
371
+ case 0: return [4 /*yield*/, setup];
372
+ case 1:
373
+ _a.sent();
374
+ baUser = makeBetterAuthUser({ name: null });
375
+ return [4 /*yield*/, (0, betterAuthSetup_1.syncBetterAuthUser)(TestUser, baUser)];
376
+ case 2:
377
+ result = _a.sent();
378
+ (0, bun_test_1.expect)(result.name).toBe("test");
379
+ return [2 /*return*/];
380
+ }
381
+ });
382
+ }); });
383
+ (0, bun_test_1.it)("does not overwrite name when betterAuthUser.name is null", function () { return __awaiter(void 0, void 0, void 0, function () {
384
+ var baUser, result;
385
+ return __generator(this, function (_a) {
386
+ switch (_a.label) {
387
+ case 0: return [4 /*yield*/, setup];
388
+ case 1:
389
+ _a.sent();
390
+ return [4 /*yield*/, TestUser.create({
391
+ betterAuthId: "ba-user-123",
392
+ email: "test@example.com",
393
+ name: "Keep This Name",
394
+ })];
395
+ case 2:
396
+ _a.sent();
397
+ baUser = makeBetterAuthUser({ name: null });
398
+ return [4 /*yield*/, (0, betterAuthSetup_1.syncBetterAuthUser)(TestUser, baUser)];
399
+ case 3:
400
+ result = _a.sent();
401
+ (0, bun_test_1.expect)(result.name).toBe("Keep This Name");
402
+ return [2 /*return*/];
403
+ }
404
+ });
405
+ }); });
406
+ });
407
+ (0, bun_test_1.describe)("createBetterAuthSessionMiddleware", function () {
408
+ (0, bun_test_1.it)("calls next when no session exists", function () { return __awaiter(void 0, void 0, void 0, function () {
409
+ var config, auth, middleware, req, res, next;
410
+ return __generator(this, function (_a) {
411
+ switch (_a.label) {
412
+ case 0: return [4 /*yield*/, setup];
413
+ case 1:
414
+ _a.sent();
415
+ config = {
416
+ baseURL: "http://localhost:3000",
417
+ enabled: true,
418
+ secret: "test-secret-at-least-32-characters-long",
419
+ };
420
+ auth = (0, betterAuthSetup_1.createBetterAuth)({ config: config, mongoClient: getClient() });
421
+ middleware = (0, betterAuthSetup_1.createBetterAuthSessionMiddleware)(auth);
422
+ req = { headers: {} };
423
+ res = {};
424
+ next = (0, bun_test_1.mock)(function () { });
425
+ return [4 /*yield*/, middleware(req, res, next)];
426
+ case 2:
427
+ _a.sent();
428
+ (0, bun_test_1.expect)(next).toHaveBeenCalledTimes(1);
429
+ (0, bun_test_1.expect)(req.user).toBeUndefined();
430
+ return [2 /*return*/];
431
+ }
432
+ });
433
+ }); });
434
+ (0, bun_test_1.it)("calls next on error without crashing", function () { return __awaiter(void 0, void 0, void 0, function () {
435
+ var config, auth, origGetSession, middleware, req, res, next;
436
+ return __generator(this, function (_a) {
437
+ switch (_a.label) {
438
+ case 0: return [4 /*yield*/, setup];
439
+ case 1:
440
+ _a.sent();
441
+ config = {
442
+ baseURL: "http://localhost:3000",
443
+ enabled: true,
444
+ secret: "test-secret-at-least-32-characters-long",
445
+ };
446
+ auth = (0, betterAuthSetup_1.createBetterAuth)({ config: config, mongoClient: getClient() });
447
+ origGetSession = auth.api.getSession;
448
+ auth.api.getSession = function () {
449
+ throw new Error("Session error");
450
+ };
451
+ middleware = (0, betterAuthSetup_1.createBetterAuthSessionMiddleware)(auth);
452
+ req = { headers: {} };
453
+ res = {};
454
+ next = (0, bun_test_1.mock)(function () { });
455
+ return [4 /*yield*/, middleware(req, res, next)];
456
+ case 2:
457
+ _a.sent();
458
+ (0, bun_test_1.expect)(next).toHaveBeenCalledTimes(1);
459
+ (0, bun_test_1.expect)(req.user).toBeUndefined();
460
+ auth.api.getSession = origGetSession;
461
+ return [2 /*return*/];
462
+ }
463
+ });
464
+ }); });
465
+ (0, bun_test_1.it)("attaches basic user data when no userModel is provided", function () { return __awaiter(void 0, void 0, void 0, function () {
466
+ var config, auth, mockSession, middleware, req, res, next;
467
+ return __generator(this, function (_a) {
468
+ switch (_a.label) {
469
+ case 0: return [4 /*yield*/, setup];
470
+ case 1:
471
+ _a.sent();
472
+ config = {
473
+ baseURL: "http://localhost:3000",
474
+ enabled: true,
475
+ secret: "test-secret-at-least-32-characters-long",
476
+ };
477
+ auth = (0, betterAuthSetup_1.createBetterAuth)({ config: config, mongoClient: getClient() });
478
+ mockSession = {
479
+ session: { id: "session-1", userId: "user-1" },
480
+ user: {
481
+ email: "user@example.com",
482
+ id: "user-1",
483
+ name: "Test User",
484
+ },
485
+ };
486
+ // Override getSession to return mock session
487
+ auth.api.getSession = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
488
+ return [2 /*return*/, mockSession];
489
+ }); }); };
490
+ middleware = (0, betterAuthSetup_1.createBetterAuthSessionMiddleware)(auth);
491
+ req = { headers: {} };
492
+ res = {};
493
+ next = (0, bun_test_1.mock)(function () { });
494
+ return [4 /*yield*/, middleware(req, res, next)];
495
+ case 2:
496
+ _a.sent();
497
+ (0, bun_test_1.expect)(next).toHaveBeenCalledTimes(1);
498
+ (0, bun_test_1.expect)(req.user).toBeDefined();
499
+ (0, bun_test_1.expect)(req.user.email).toBe("user@example.com");
500
+ (0, bun_test_1.expect)(req.user.betterAuthId).toBe("user-1");
501
+ (0, bun_test_1.expect)(req.user.admin).toBe(false);
502
+ (0, bun_test_1.expect)(req.betterAuthSession).toBe(mockSession);
503
+ return [2 /*return*/];
504
+ }
505
+ });
506
+ }); });
507
+ (0, bun_test_1.it)("looks up app user by betterAuthId when userModel is provided", function () { return __awaiter(void 0, void 0, void 0, function () {
508
+ var config, appUser, auth, mockSession, middleware, req, res, next;
509
+ return __generator(this, function (_a) {
510
+ switch (_a.label) {
511
+ case 0: return [4 /*yield*/, setup];
512
+ case 1:
513
+ _a.sent();
514
+ config = {
515
+ baseURL: "http://localhost:3000",
516
+ enabled: true,
517
+ secret: "test-secret-at-least-32-characters-long",
518
+ };
519
+ return [4 /*yield*/, TestUser.create({
520
+ betterAuthId: "user-1",
521
+ email: "user@example.com",
522
+ name: "App User",
523
+ })];
524
+ case 2:
525
+ appUser = _a.sent();
526
+ auth = (0, betterAuthSetup_1.createBetterAuth)({ config: config, mongoClient: getClient() });
527
+ mockSession = {
528
+ session: { id: "session-1", userId: "user-1" },
529
+ user: {
530
+ email: "user@example.com",
531
+ id: "user-1",
532
+ name: "Test User",
533
+ },
534
+ };
535
+ auth.api.getSession = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
536
+ return [2 /*return*/, mockSession];
537
+ }); }); };
538
+ middleware = (0, betterAuthSetup_1.createBetterAuthSessionMiddleware)(auth, TestUser);
539
+ req = { headers: {} };
540
+ res = {};
541
+ next = (0, bun_test_1.mock)(function () { });
542
+ return [4 /*yield*/, middleware(req, res, next)];
543
+ case 3:
544
+ _a.sent();
545
+ (0, bun_test_1.expect)(next).toHaveBeenCalledTimes(1);
546
+ (0, bun_test_1.expect)(req.user).toBeDefined();
547
+ (0, bun_test_1.expect)(req.user._id.toString()).toBe(appUser._id.toString());
548
+ (0, bun_test_1.expect)(req.betterAuthSession).toBe(mockSession);
549
+ return [2 /*return*/];
550
+ }
551
+ });
552
+ }); });
553
+ (0, bun_test_1.it)("creates app user via sync when not found by betterAuthId", function () { return __awaiter(void 0, void 0, void 0, function () {
554
+ var config, auth, mockSession, middleware, req, res, next, count;
555
+ return __generator(this, function (_a) {
556
+ switch (_a.label) {
557
+ case 0: return [4 /*yield*/, setup];
558
+ case 1:
559
+ _a.sent();
560
+ config = {
561
+ baseURL: "http://localhost:3000",
562
+ enabled: true,
563
+ secret: "test-secret-at-least-32-characters-long",
564
+ };
565
+ auth = (0, betterAuthSetup_1.createBetterAuth)({ config: config, mongoClient: getClient() });
566
+ mockSession = {
567
+ session: { id: "session-1", userId: "new-user-1" },
568
+ user: {
569
+ email: "newuser@example.com",
570
+ id: "new-user-1",
571
+ name: "New User",
572
+ },
573
+ };
574
+ auth.api.getSession = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
575
+ return [2 /*return*/, mockSession];
576
+ }); }); };
577
+ middleware = (0, betterAuthSetup_1.createBetterAuthSessionMiddleware)(auth, TestUser);
578
+ req = { headers: {} };
579
+ res = {};
580
+ next = (0, bun_test_1.mock)(function () { });
581
+ return [4 /*yield*/, middleware(req, res, next)];
582
+ case 2:
583
+ _a.sent();
584
+ (0, bun_test_1.expect)(next).toHaveBeenCalledTimes(1);
585
+ (0, bun_test_1.expect)(req.user).toBeDefined();
586
+ (0, bun_test_1.expect)(req.user.betterAuthId).toBe("new-user-1");
587
+ (0, bun_test_1.expect)(req.user.email).toBe("newuser@example.com");
588
+ return [4 /*yield*/, TestUser.countDocuments()];
589
+ case 3:
590
+ count = _a.sent();
591
+ (0, bun_test_1.expect)(count).toBe(1);
592
+ return [2 /*return*/];
593
+ }
594
+ });
595
+ }); });
596
+ });
597
+ (0, bun_test_1.describe)("mountBetterAuthRoutes", function () {
598
+ (0, bun_test_1.it)("mounts routes at the default path", function () { return __awaiter(void 0, void 0, void 0, function () {
599
+ var config, auth, app;
600
+ return __generator(this, function (_a) {
601
+ switch (_a.label) {
602
+ case 0: return [4 /*yield*/, setup];
603
+ case 1:
604
+ _a.sent();
605
+ config = {
606
+ baseURL: "http://localhost:3000",
607
+ enabled: true,
608
+ secret: "test-secret-at-least-32-characters-long",
609
+ };
610
+ auth = (0, betterAuthSetup_1.createBetterAuth)({ config: config, mongoClient: getClient() });
611
+ app = (0, express_1.default)();
612
+ (0, bun_test_1.expect)(function () { return (0, betterAuthSetup_1.mountBetterAuthRoutes)(app, auth); }).not.toThrow();
613
+ return [2 /*return*/];
614
+ }
615
+ });
616
+ }); });
617
+ (0, bun_test_1.it)("mounts routes at a custom path", function () { return __awaiter(void 0, void 0, void 0, function () {
618
+ var config, auth, app;
619
+ return __generator(this, function (_a) {
620
+ switch (_a.label) {
621
+ case 0: return [4 /*yield*/, setup];
622
+ case 1:
623
+ _a.sent();
624
+ config = {
625
+ baseURL: "http://localhost:3000",
626
+ enabled: true,
627
+ secret: "test-secret-at-least-32-characters-long",
628
+ };
629
+ auth = (0, betterAuthSetup_1.createBetterAuth)({ config: config, mongoClient: getClient() });
630
+ app = (0, express_1.default)();
631
+ (0, bun_test_1.expect)(function () { return (0, betterAuthSetup_1.mountBetterAuthRoutes)(app, auth, "/custom/auth"); }).not.toThrow();
632
+ return [2 /*return*/];
633
+ }
634
+ });
635
+ }); });
636
+ });
637
+ (0, bun_test_1.describe)("getMongoClientFromMongoose", function () {
638
+ (0, bun_test_1.it)("returns the mongo client when connected", function () {
639
+ // Default mongoose connection is set up by bunSetup.ts preload
640
+ var client = (0, betterAuthSetup_1.getMongoClientFromMongoose)();
641
+ (0, bun_test_1.expect)(client).toBeDefined();
642
+ });
643
+ });
644
+ (0, bun_test_1.describe)("getBetterAuthSession", function () {
645
+ (0, bun_test_1.it)("returns null when no session is set", function () {
646
+ var req = {};
647
+ (0, bun_test_1.expect)((0, betterAuthSetup_1.getBetterAuthSession)(req)).toBeNull();
648
+ });
649
+ (0, bun_test_1.it)("returns session data when set", function () {
650
+ var sessionData = { session: { id: "s1" }, user: { id: "u1" } };
651
+ var req = { betterAuthSession: sessionData };
652
+ (0, bun_test_1.expect)((0, betterAuthSetup_1.getBetterAuthSession)(req)).toBe(sessionData);
653
+ });
654
+ });
655
+ (0, bun_test_1.describe)("hasBetterAuthSession", function () {
656
+ (0, bun_test_1.it)("returns false when no session is set", function () {
657
+ var req = {};
658
+ (0, bun_test_1.expect)((0, betterAuthSetup_1.hasBetterAuthSession)(req)).toBe(false);
659
+ });
660
+ (0, bun_test_1.it)("returns true when session is set", function () {
661
+ var req = { betterAuthSession: { session: {}, user: {} } };
662
+ (0, bun_test_1.expect)((0, betterAuthSetup_1.hasBetterAuthSession)(req)).toBe(true);
663
+ });
664
+ });
665
+ (0, bun_test_1.describe)("setupBetterAuthUserSync", function () {
666
+ (0, bun_test_1.it)("does not throw", function () { return __awaiter(void 0, void 0, void 0, function () {
667
+ var config, auth;
668
+ return __generator(this, function (_a) {
669
+ switch (_a.label) {
670
+ case 0: return [4 /*yield*/, setup];
671
+ case 1:
672
+ _a.sent();
673
+ config = {
674
+ baseURL: "http://localhost:3000",
675
+ enabled: true,
676
+ secret: "test-secret-at-least-32-characters-long",
677
+ };
678
+ auth = (0, betterAuthSetup_1.createBetterAuth)({ config: config, mongoClient: getClient() });
679
+ (0, bun_test_1.expect)(function () { return (0, betterAuthSetup_1.setupBetterAuthUserSync)(auth, TestUser); }).not.toThrow();
680
+ return [2 /*return*/];
681
+ }
682
+ });
683
+ }); });
684
+ });