@terreno/api 0.9.3 → 0.11.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 (52) hide show
  1. package/bunfig.toml +5 -2
  2. package/bunfig.unit.toml +3 -0
  3. package/dist/auth.test.js +257 -0
  4. package/dist/consentApp.test.js +245 -0
  5. package/dist/expressServer.js +3 -9
  6. package/dist/expressServer.test.js +4 -7
  7. package/dist/githubAuth.test.js +380 -0
  8. package/dist/logger.test.d.ts +1 -0
  9. package/dist/logger.test.js +143 -0
  10. package/dist/notifiers/googleChatNotifier.test.js +37 -0
  11. package/dist/openApi.js +2 -2
  12. package/dist/openApi.test.js +125 -0
  13. package/dist/openApiBuilder.d.ts +1 -0
  14. package/dist/openApiBuilder.js +13 -2
  15. package/dist/openApiBuilder.test.js +66 -0
  16. package/dist/openApiEtag.test.js +8 -0
  17. package/dist/openApiValidator.test.js +309 -0
  18. package/dist/permissions.middleware.test.d.ts +1 -0
  19. package/dist/permissions.middleware.test.js +341 -0
  20. package/dist/plugins.d.ts +8 -8
  21. package/dist/plugins.js +38 -32
  22. package/dist/populate.test.js +99 -0
  23. package/dist/syncConsents.js +2 -2
  24. package/dist/syncConsents.test.js +273 -0
  25. package/dist/tests/bunSetup.js +27 -22
  26. package/dist/tests.d.ts +3 -3
  27. package/dist/tests.js +78 -82
  28. package/dist/utils.d.ts +2 -2
  29. package/dist/utils.js +7 -7
  30. package/package.json +2 -1
  31. package/src/__snapshots__/openApi.test.ts.snap +48 -0
  32. package/src/auth.test.ts +147 -0
  33. package/src/consentApp.test.ts +162 -0
  34. package/src/expressServer.test.ts +4 -11
  35. package/src/expressServer.ts +4 -8
  36. package/src/githubAuth.test.ts +307 -1
  37. package/src/logger.test.ts +149 -0
  38. package/src/notifiers/googleChatNotifier.test.ts +24 -0
  39. package/src/openApi.test.ts +157 -1
  40. package/src/openApi.ts +6 -2
  41. package/src/openApiBuilder.test.ts +81 -0
  42. package/src/openApiBuilder.ts +17 -2
  43. package/src/openApiEtag.test.ts +11 -0
  44. package/src/openApiValidator.test.ts +410 -0
  45. package/src/permissions.middleware.test.ts +197 -0
  46. package/src/plugins.ts +32 -23
  47. package/src/populate.test.ts +78 -2
  48. package/src/syncConsents.test.ts +145 -0
  49. package/src/syncConsents.ts +1 -1
  50. package/src/tests/bunSetup.ts +14 -8
  51. package/src/tests.ts +8 -8
  52. package/src/utils.ts +4 -4
@@ -176,7 +176,7 @@ var syncConsents = function (definitions_1) {
176
176
  args_1[_i - 1] = arguments[_i];
177
177
  }
178
178
  return __awaiter(void 0, __spreadArray([definitions_1], __read(args_1), false), void 0, function (definitions, options) {
179
- var _a, deactivateRemoved, _b, dryRun, result, slugs, activeForms, activeBySlug, slugs_1, slugs_1_1, slug, def, existing, newVersion, e_1_1, activeBySlug_1, activeBySlug_1_1, _c, slug, form, e_2_1, summary;
179
+ var _a, deactivateRemoved, _b, dryRun, result, slugs, activeForms, activeBySlug, slugs_1, slugs_1_1, slug, def, existing, newVersion, e_1_1, activeBySlug_1, activeBySlug_1_1, _c, slug, e_2_1, summary;
180
180
  var e_1, _d, e_2, _e;
181
181
  var _f, _g, _h, _j;
182
182
  if (options === void 0) { options = {}; }
@@ -291,7 +291,7 @@ var syncConsents = function (definitions_1) {
291
291
  _k.label = 16;
292
292
  case 16:
293
293
  if (!!activeBySlug_1_1.done) return [3 /*break*/, 20];
294
- _c = __read(activeBySlug_1_1.value, 2), slug = _c[0], form = _c[1];
294
+ _c = __read(activeBySlug_1_1.value, 1), slug = _c[0];
295
295
  if (!!definitions[slug]) return [3 /*break*/, 19];
296
296
  logger_1.logger.info("syncConsents: deactivating \"".concat(slug, "\""), { dryRun: dryRun });
297
297
  if (!!dryRun) return [3 /*break*/, 18];
@@ -246,4 +246,277 @@ var baseDef = {
246
246
  }
247
247
  });
248
248
  }); });
249
+ (0, bun_test_1.it)("publishes new version when type changes", function () { return __awaiter(void 0, void 0, void 0, function () {
250
+ var updated, result;
251
+ return __generator(this, function (_a) {
252
+ switch (_a.label) {
253
+ case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
254
+ case 1:
255
+ _a.sent();
256
+ updated = __assign(__assign({}, baseDef), { type: "privacy" });
257
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
258
+ case 2:
259
+ result = _a.sent();
260
+ (0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
261
+ return [2 /*return*/];
262
+ }
263
+ });
264
+ }); });
265
+ (0, bun_test_1.it)("publishes new version when order changes", function () { return __awaiter(void 0, void 0, void 0, function () {
266
+ var updated, result;
267
+ return __generator(this, function (_a) {
268
+ switch (_a.label) {
269
+ case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
270
+ case 1:
271
+ _a.sent();
272
+ updated = __assign(__assign({}, baseDef), { order: 99 });
273
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
274
+ case 2:
275
+ result = _a.sent();
276
+ (0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
277
+ return [2 /*return*/];
278
+ }
279
+ });
280
+ }); });
281
+ (0, bun_test_1.it)("publishes new version when required changes", function () { return __awaiter(void 0, void 0, void 0, function () {
282
+ var updated, result;
283
+ return __generator(this, function (_a) {
284
+ switch (_a.label) {
285
+ case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
286
+ case 1:
287
+ _a.sent();
288
+ updated = __assign(__assign({}, baseDef), { required: false });
289
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
290
+ case 2:
291
+ result = _a.sent();
292
+ (0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
293
+ return [2 /*return*/];
294
+ }
295
+ });
296
+ }); });
297
+ (0, bun_test_1.it)("publishes new version when requireScrollToBottom changes", function () { return __awaiter(void 0, void 0, void 0, function () {
298
+ var updated, result;
299
+ return __generator(this, function (_a) {
300
+ switch (_a.label) {
301
+ case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
302
+ case 1:
303
+ _a.sent();
304
+ updated = __assign(__assign({}, baseDef), { requireScrollToBottom: true });
305
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
306
+ case 2:
307
+ result = _a.sent();
308
+ (0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
309
+ return [2 /*return*/];
310
+ }
311
+ });
312
+ }); });
313
+ (0, bun_test_1.it)("publishes new version when captureSignature changes", function () { return __awaiter(void 0, void 0, void 0, function () {
314
+ var updated, result;
315
+ return __generator(this, function (_a) {
316
+ switch (_a.label) {
317
+ case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
318
+ case 1:
319
+ _a.sent();
320
+ updated = __assign(__assign({}, baseDef), { captureSignature: true });
321
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
322
+ case 2:
323
+ result = _a.sent();
324
+ (0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
325
+ return [2 /*return*/];
326
+ }
327
+ });
328
+ }); });
329
+ (0, bun_test_1.it)("publishes new version when agreeButtonText changes", function () { return __awaiter(void 0, void 0, void 0, function () {
330
+ var updated, result;
331
+ return __generator(this, function (_a) {
332
+ switch (_a.label) {
333
+ case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
334
+ case 1:
335
+ _a.sent();
336
+ updated = __assign(__assign({}, baseDef), { agreeButtonText: "Consent" });
337
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
338
+ case 2:
339
+ result = _a.sent();
340
+ (0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
341
+ return [2 /*return*/];
342
+ }
343
+ });
344
+ }); });
345
+ (0, bun_test_1.it)("publishes new version when allowDecline changes", function () { return __awaiter(void 0, void 0, void 0, function () {
346
+ var updated, result;
347
+ return __generator(this, function (_a) {
348
+ switch (_a.label) {
349
+ case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
350
+ case 1:
351
+ _a.sent();
352
+ updated = __assign(__assign({}, baseDef), { allowDecline: true });
353
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
354
+ case 2:
355
+ result = _a.sent();
356
+ (0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
357
+ return [2 /*return*/];
358
+ }
359
+ });
360
+ }); });
361
+ (0, bun_test_1.it)("publishes new version when declineButtonText changes", function () { return __awaiter(void 0, void 0, void 0, function () {
362
+ var updated, result;
363
+ return __generator(this, function (_a) {
364
+ switch (_a.label) {
365
+ case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
366
+ case 1:
367
+ _a.sent();
368
+ updated = __assign(__assign({}, baseDef), { allowDecline: true, declineButtonText: "No Thanks" });
369
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
370
+ case 2:
371
+ result = _a.sent();
372
+ (0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
373
+ return [2 /*return*/];
374
+ }
375
+ });
376
+ }); });
377
+ (0, bun_test_1.it)("publishes new version when defaultLocale changes", function () { return __awaiter(void 0, void 0, void 0, function () {
378
+ var updated, result;
379
+ return __generator(this, function (_a) {
380
+ switch (_a.label) {
381
+ case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
382
+ case 1:
383
+ _a.sent();
384
+ updated = __assign(__assign({}, baseDef), { defaultLocale: "es" });
385
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
386
+ case 2:
387
+ result = _a.sent();
388
+ (0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
389
+ return [2 /*return*/];
390
+ }
391
+ });
392
+ }); });
393
+ (0, bun_test_1.it)("publishes new version when content locale count changes", function () { return __awaiter(void 0, void 0, void 0, function () {
394
+ var updated, result;
395
+ return __generator(this, function (_a) {
396
+ switch (_a.label) {
397
+ case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
398
+ case 1:
399
+ _a.sent();
400
+ updated = __assign(__assign({}, baseDef), { content: { en: baseDef.content.en, es: "# Términos" } });
401
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
402
+ case 2:
403
+ result = _a.sent();
404
+ (0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
405
+ return [2 /*return*/];
406
+ }
407
+ });
408
+ }); });
409
+ (0, bun_test_1.it)("publishes new version when checkbox count changes", function () { return __awaiter(void 0, void 0, void 0, function () {
410
+ var updated, result;
411
+ return __generator(this, function (_a) {
412
+ switch (_a.label) {
413
+ case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({
414
+ terms: __assign(__assign({}, baseDef), { checkboxes: [{ label: "Agree", required: true }] }),
415
+ })];
416
+ case 1:
417
+ _a.sent();
418
+ updated = __assign(__assign({}, baseDef), { checkboxes: [
419
+ { label: "Agree", required: true },
420
+ { label: "Also agree", required: false },
421
+ ] });
422
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
423
+ case 2:
424
+ result = _a.sent();
425
+ (0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
426
+ return [2 /*return*/];
427
+ }
428
+ });
429
+ }); });
430
+ (0, bun_test_1.it)("publishes new version when checkbox label changes", function () { return __awaiter(void 0, void 0, void 0, function () {
431
+ var updated, result;
432
+ return __generator(this, function (_a) {
433
+ switch (_a.label) {
434
+ case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({
435
+ terms: __assign(__assign({}, baseDef), { checkboxes: [{ label: "Agree", required: true }] }),
436
+ })];
437
+ case 1:
438
+ _a.sent();
439
+ updated = __assign(__assign({}, baseDef), { checkboxes: [{ label: "I Agree", required: true }] });
440
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
441
+ case 2:
442
+ result = _a.sent();
443
+ (0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
444
+ return [2 /*return*/];
445
+ }
446
+ });
447
+ }); });
448
+ (0, bun_test_1.it)("publishes new version when checkbox confirmationPrompt changes", function () { return __awaiter(void 0, void 0, void 0, function () {
449
+ var updated, result;
450
+ return __generator(this, function (_a) {
451
+ switch (_a.label) {
452
+ case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({
453
+ terms: __assign(__assign({}, baseDef), { checkboxes: [{ confirmationPrompt: "Sure?", label: "Agree", required: true }] }),
454
+ })];
455
+ case 1:
456
+ _a.sent();
457
+ updated = __assign(__assign({}, baseDef), { checkboxes: [{ confirmationPrompt: "Are you sure?", label: "Agree", required: true }] });
458
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated })];
459
+ case 2:
460
+ result = _a.sent();
461
+ (0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
462
+ return [2 /*return*/];
463
+ }
464
+ });
465
+ }); });
466
+ (0, bun_test_1.it)("leaves unchanged forms alone with checkboxes present", function () { return __awaiter(void 0, void 0, void 0, function () {
467
+ var withCheckboxes, result;
468
+ return __generator(this, function (_a) {
469
+ switch (_a.label) {
470
+ case 0:
471
+ withCheckboxes = __assign(__assign({}, baseDef), { checkboxes: [{ confirmationPrompt: "Sure?", label: "Agree", required: true }] });
472
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: withCheckboxes })];
473
+ case 1:
474
+ _a.sent();
475
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: withCheckboxes })];
476
+ case 2:
477
+ result = _a.sent();
478
+ (0, bun_test_1.expect)(result.unchanged).toEqual(["terms"]);
479
+ return [2 /*return*/];
480
+ }
481
+ });
482
+ }); });
483
+ (0, bun_test_1.it)("dry run does not create new versions", function () { return __awaiter(void 0, void 0, void 0, function () {
484
+ var updated, result, forms;
485
+ return __generator(this, function (_a) {
486
+ switch (_a.label) {
487
+ case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef })];
488
+ case 1:
489
+ _a.sent();
490
+ updated = __assign(__assign({}, baseDef), { title: "Updated" });
491
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: updated }, { dryRun: true })];
492
+ case 2:
493
+ result = _a.sent();
494
+ (0, bun_test_1.expect)(result.updated).toEqual(["terms"]);
495
+ return [4 /*yield*/, consentForm_1.ConsentForm.find({ slug: "terms" })];
496
+ case 3:
497
+ forms = _a.sent();
498
+ (0, bun_test_1.expect)(forms).toHaveLength(1); // No new version created
499
+ return [2 /*return*/];
500
+ }
501
+ });
502
+ }); });
503
+ (0, bun_test_1.it)("dry run does not deactivate forms", function () { return __awaiter(void 0, void 0, void 0, function () {
504
+ var result, privacy;
505
+ return __generator(this, function (_a) {
506
+ switch (_a.label) {
507
+ case 0: return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ privacy: __assign(__assign({}, baseDef), { title: "Privacy", type: "privacy" }), terms: baseDef })];
508
+ case 1:
509
+ _a.sent();
510
+ return [4 /*yield*/, (0, syncConsents_1.syncConsents)({ terms: baseDef }, { deactivateRemoved: true, dryRun: true })];
511
+ case 2:
512
+ result = _a.sent();
513
+ (0, bun_test_1.expect)(result.deactivated).toEqual(["privacy"]);
514
+ return [4 /*yield*/, consentForm_1.ConsentForm.findOne({ slug: "privacy" })];
515
+ case 3:
516
+ privacy = _a.sent();
517
+ (0, bun_test_1.expect)(privacy === null || privacy === void 0 ? void 0 : privacy.active).toBe(true); // Still active
518
+ return [2 /*return*/];
519
+ }
520
+ });
521
+ }); });
249
522
  });
@@ -70,30 +70,35 @@ var mongoose_1 = __importDefault(require("mongoose"));
70
70
  var winston_1 = __importDefault(require("winston"));
71
71
  var expressServer_1 = require("../expressServer");
72
72
  var logger_1 = require("../logger");
73
+ var shouldConnectToTestDb = process.env.BUN_TEST_DISABLE_DB !== "true";
73
74
  // Connect to MongoDB once for all tests
74
- (0, bun_test_1.beforeAll)(function () { return __awaiter(void 0, void 0, void 0, function () {
75
- return __generator(this, function (_a) {
76
- switch (_a.label) {
77
- case 0: return [4 /*yield*/, mongoose_1.default
78
- .connect("mongodb://127.0.0.1/terreno?&connectTimeoutMS=360000")
79
- .catch(logger_1.logger.catch)];
80
- case 1:
81
- _a.sent();
82
- return [2 /*return*/];
83
- }
84
- });
85
- }); });
75
+ if (shouldConnectToTestDb) {
76
+ (0, bun_test_1.beforeAll)(function () { return __awaiter(void 0, void 0, void 0, function () {
77
+ return __generator(this, function (_a) {
78
+ switch (_a.label) {
79
+ case 0: return [4 /*yield*/, mongoose_1.default
80
+ .connect("mongodb://127.0.0.1/terreno?&connectTimeoutMS=360000")
81
+ .catch(logger_1.logger.catch)];
82
+ case 1:
83
+ _a.sent();
84
+ return [2 /*return*/];
85
+ }
86
+ });
87
+ }); });
88
+ }
86
89
  // Close MongoDB connection after all tests
87
- (0, bun_test_1.afterAll)(function () { return __awaiter(void 0, void 0, void 0, function () {
88
- return __generator(this, function (_a) {
89
- switch (_a.label) {
90
- case 0: return [4 /*yield*/, mongoose_1.default.connection.close()];
91
- case 1:
92
- _a.sent();
93
- return [2 /*return*/];
94
- }
95
- });
96
- }); });
90
+ if (shouldConnectToTestDb) {
91
+ (0, bun_test_1.afterAll)(function () { return __awaiter(void 0, void 0, void 0, function () {
92
+ return __generator(this, function (_a) {
93
+ switch (_a.label) {
94
+ case 0: return [4 /*yield*/, mongoose_1.default.connection.close()];
95
+ case 1:
96
+ _a.sent();
97
+ return [2 /*return*/];
98
+ }
99
+ });
100
+ }); });
101
+ }
97
102
  var logs = [];
98
103
  var SHOW_ALL_LOGS = process.env.SHOW_ALL_TEST_LOGS === "true";
99
104
  // Create a custom stream that captures logs
package/dist/tests.d.ts CHANGED
@@ -71,9 +71,9 @@ export declare const RequiredModel: mongoose.Model<RequiredField, {}, {}, {}, mo
71
71
  } & {
72
72
  __v: number;
73
73
  }, any>;
74
- export declare function getBaseServer(): Express;
75
- export declare function authAsUser(app: express.Application, type: "admin" | "notAdmin"): Promise<TestAgent>;
76
- export declare function setupDb(): Promise<(mongoose.Document<unknown, {}, User, {}, {}> & User & {
74
+ export declare const getBaseServer: () => Express;
75
+ export declare const authAsUser: (app: express.Application, type: "admin" | "notAdmin") => Promise<TestAgent>;
76
+ export declare const setupDb: () => Promise<(mongoose.Document<unknown, {}, User, {}, {}> & User & {
77
77
  _id: mongoose.Types.ObjectId;
78
78
  } & {
79
79
  __v: number;
package/dist/tests.js CHANGED
@@ -88,10 +88,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
88
88
  return (mod && mod.__esModule) ? mod : { "default": mod };
89
89
  };
90
90
  Object.defineProperty(exports, "__esModule", { value: true });
91
- exports.RequiredModel = exports.FoodModel = exports.StaffUserModel = exports.SuperUserModel = exports.UserModel = void 0;
92
- exports.getBaseServer = getBaseServer;
93
- exports.authAsUser = authAsUser;
94
- exports.setupDb = setupDb;
91
+ exports.setupDb = exports.authAsUser = exports.getBaseServer = exports.RequiredModel = exports.FoodModel = exports.StaffUserModel = exports.SuperUserModel = exports.UserModel = void 0;
95
92
  var express_1 = __importDefault(require("express"));
96
93
  var mongoose_1 = __importStar(require("mongoose"));
97
94
  var passport_local_mongoose_1 = __importDefault(require("passport-local-mongoose"));
@@ -189,7 +186,7 @@ var requiredSchema = new mongoose_1.Schema({
189
186
  name: { description: "The name of the item", required: true, type: String },
190
187
  });
191
188
  exports.RequiredModel = (0, mongoose_1.model)("Required", requiredSchema);
192
- function getBaseServer() {
189
+ var getBaseServer = function () {
193
190
  var app = (0, express_1.default)();
194
191
  app.set("query parser", function (str) { return qs_1.default.parse(str, { arrayLimit: 200 }); });
195
192
  // Express 5 defaults to 'simple' query parser (Node querystring) which doesn't
@@ -211,82 +208,81 @@ function getBaseServer() {
211
208
  });
212
209
  app.use(express_1.default.json());
213
210
  return app;
214
- }
215
- function authAsUser(app, type) {
216
- return __awaiter(this, void 0, void 0, function () {
217
- var email, password, agent, res;
218
- return __generator(this, function (_a) {
219
- switch (_a.label) {
220
- case 0:
221
- email = type === "admin" ? "admin@example.com" : "notAdmin@example.com";
222
- password = type === "admin" ? "securePassword" : "password";
223
- agent = supertest_1.default.agent(app);
224
- return [4 /*yield*/, agent.post("/auth/login").send({ email: email, password: password }).expect(200)];
225
- case 1:
226
- res = _a.sent();
227
- return [4 /*yield*/, agent.set("authorization", "Bearer ".concat(res.body.data.token))];
228
- case 2:
229
- _a.sent();
230
- return [2 /*return*/, agent];
231
- }
232
- });
211
+ };
212
+ exports.getBaseServer = getBaseServer;
213
+ var authAsUser = function (app, type) { return __awaiter(void 0, void 0, void 0, function () {
214
+ var email, password, agent, res;
215
+ return __generator(this, function (_a) {
216
+ switch (_a.label) {
217
+ case 0:
218
+ email = type === "admin" ? "admin@example.com" : "notAdmin@example.com";
219
+ password = type === "admin" ? "securePassword" : "password";
220
+ agent = supertest_1.default.agent(app);
221
+ return [4 /*yield*/, agent.post("/auth/login").send({ email: email, password: password }).expect(200)];
222
+ case 1:
223
+ res = _a.sent();
224
+ return [4 /*yield*/, agent.set("authorization", "Bearer ".concat(res.body.data.token))];
225
+ case 2:
226
+ _a.sent();
227
+ return [2 /*return*/, agent];
228
+ }
233
229
  });
234
- }
235
- function setupDb() {
236
- return __awaiter(this, void 0, void 0, function () {
237
- var _a, notAdmin, admin, adminOther, error_1;
238
- return __generator(this, function (_b) {
239
- switch (_b.label) {
240
- case 0: return [4 /*yield*/, mongoose_1.default
241
- .connect("mongodb://127.0.0.1/terreno?&connectTimeoutMS=360000")
242
- .catch(logger_1.logger.catch)];
243
- case 1:
244
- _b.sent();
245
- process.env.REFRESH_TOKEN_SECRET = "refresh_secret";
246
- process.env.TOKEN_SECRET = "secret";
247
- process.env.TOKEN_EXPIRES_IN = "30m";
248
- process.env.TOKEN_ISSUER = "example.com";
249
- process.env.SESSION_SECRET = "session";
250
- // Broken out of the try/catch below so you can test the catch logger by shutting down mongo.
251
- return [4 /*yield*/, Promise.all([exports.UserModel.deleteMany({}), exports.FoodModel.deleteMany({})]).catch(logger_1.logger.catch)];
252
- case 2:
253
- // Broken out of the try/catch below so you can test the catch logger by shutting down mongo.
254
- _b.sent();
255
- _b.label = 3;
256
- case 3:
257
- _b.trys.push([3, 11, , 12]);
258
- return [4 /*yield*/, Promise.all([
259
- exports.UserModel.create({ email: "notAdmin@example.com", name: "Not Admin" }),
260
- exports.UserModel.create({ admin: true, email: "admin@example.com", name: "Admin" }),
261
- exports.UserModel.create({ admin: true, email: "admin+other@example.com", name: "Admin Other" }),
262
- ])];
263
- case 4:
264
- _a = __read.apply(void 0, [_b.sent(), 3]), notAdmin = _a[0], admin = _a[1], adminOther = _a[2];
265
- return [4 /*yield*/, notAdmin.setPassword("password")];
266
- case 5:
267
- _b.sent();
268
- return [4 /*yield*/, notAdmin.save()];
269
- case 6:
270
- _b.sent();
271
- return [4 /*yield*/, admin.setPassword("securePassword")];
272
- case 7:
273
- _b.sent();
274
- return [4 /*yield*/, admin.save()];
275
- case 8:
276
- _b.sent();
277
- return [4 /*yield*/, adminOther.setPassword("otherPassword")];
278
- case 9:
279
- _b.sent();
280
- return [4 /*yield*/, adminOther.save()];
281
- case 10:
282
- _b.sent();
283
- return [2 /*return*/, [admin, notAdmin, adminOther]];
284
- case 11:
285
- error_1 = _b.sent();
286
- console.error("Error setting up DB", error_1);
287
- throw error_1;
288
- case 12: return [2 /*return*/];
289
- }
290
- });
230
+ }); };
231
+ exports.authAsUser = authAsUser;
232
+ var setupDb = function () { return __awaiter(void 0, void 0, void 0, function () {
233
+ var _a, notAdmin, admin, adminOther, error_1;
234
+ return __generator(this, function (_b) {
235
+ switch (_b.label) {
236
+ case 0: return [4 /*yield*/, mongoose_1.default
237
+ .connect("mongodb://127.0.0.1/terreno?&connectTimeoutMS=360000")
238
+ .catch(logger_1.logger.catch)];
239
+ case 1:
240
+ _b.sent();
241
+ process.env.REFRESH_TOKEN_SECRET = "refresh_secret";
242
+ process.env.TOKEN_SECRET = "secret";
243
+ process.env.TOKEN_EXPIRES_IN = "30m";
244
+ process.env.TOKEN_ISSUER = "example.com";
245
+ process.env.SESSION_SECRET = "session";
246
+ // Broken out of the try/catch below so you can test the catch logger by shutting down mongo.
247
+ return [4 /*yield*/, Promise.all([exports.UserModel.deleteMany({}), exports.FoodModel.deleteMany({})]).catch(logger_1.logger.catch)];
248
+ case 2:
249
+ // Broken out of the try/catch below so you can test the catch logger by shutting down mongo.
250
+ _b.sent();
251
+ _b.label = 3;
252
+ case 3:
253
+ _b.trys.push([3, 11, , 12]);
254
+ return [4 /*yield*/, Promise.all([
255
+ exports.UserModel.create({ email: "notAdmin@example.com", name: "Not Admin" }),
256
+ exports.UserModel.create({ admin: true, email: "admin@example.com", name: "Admin" }),
257
+ exports.UserModel.create({ admin: true, email: "admin+other@example.com", name: "Admin Other" }),
258
+ ])];
259
+ case 4:
260
+ _a = __read.apply(void 0, [_b.sent(), 3]), notAdmin = _a[0], admin = _a[1], adminOther = _a[2];
261
+ return [4 /*yield*/, notAdmin.setPassword("password")];
262
+ case 5:
263
+ _b.sent();
264
+ return [4 /*yield*/, notAdmin.save()];
265
+ case 6:
266
+ _b.sent();
267
+ return [4 /*yield*/, admin.setPassword("securePassword")];
268
+ case 7:
269
+ _b.sent();
270
+ return [4 /*yield*/, admin.save()];
271
+ case 8:
272
+ _b.sent();
273
+ return [4 /*yield*/, adminOther.setPassword("otherPassword")];
274
+ case 9:
275
+ _b.sent();
276
+ return [4 /*yield*/, adminOther.save()];
277
+ case 10:
278
+ _b.sent();
279
+ return [2 /*return*/, [admin, notAdmin, adminOther]];
280
+ case 11:
281
+ error_1 = _b.sent();
282
+ logger_1.logger.error("Error setting up DB", error_1);
283
+ throw error_1;
284
+ case 12: return [2 /*return*/];
285
+ }
291
286
  });
292
- }
287
+ }); };
288
+ exports.setupDb = setupDb;
package/dist/utils.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare function isValidObjectId(id: string): boolean;
1
+ export declare const isValidObjectId: (id: string) => boolean;
2
2
  export declare const timeout: (ms: number) => Promise<NodeJS.Timeout>;
3
3
  /**
4
4
  * Ensure that all mongoose models are set to strict mode.
@@ -8,4 +8,4 @@ export declare const timeout: (ms: number) => Promise<NodeJS.Timeout>;
8
8
  * @param ignoredModels - Array of model names to skip validation for
9
9
  * @throws Error if any model is not set to strict mode or missing virtual settings
10
10
  */
11
- export declare function checkModelsStrict(ignoredModels?: string[]): void;
11
+ export declare const checkModelsStrict: (ignoredModels?: string[]) => void;
package/dist/utils.js CHANGED
@@ -80,14 +80,12 @@ var __values = (this && this.__values) || function(o) {
80
80
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
81
81
  };
82
82
  Object.defineProperty(exports, "__esModule", { value: true });
83
- exports.timeout = void 0;
84
- exports.isValidObjectId = isValidObjectId;
85
- exports.checkModelsStrict = checkModelsStrict;
83
+ exports.checkModelsStrict = exports.timeout = exports.isValidObjectId = void 0;
86
84
  var mongoose_1 = __importStar(require("mongoose"));
87
85
  var logger_1 = require("./logger");
88
86
  // A better version of mongoose's ObjectId.isValid,
89
87
  // which falsely will say any 12 character string is valid.
90
- function isValidObjectId(id) {
88
+ var isValidObjectId = function (id) {
91
89
  try {
92
90
  return new mongoose_1.Types.ObjectId(id).toString() === id;
93
91
  }
@@ -95,7 +93,8 @@ function isValidObjectId(id) {
95
93
  logger_1.logger.error("Error validating object id ".concat(id, ": ").concat(error));
96
94
  return false;
97
95
  }
98
- }
96
+ };
97
+ exports.isValidObjectId = isValidObjectId;
99
98
  var timeout = function (ms) { return __awaiter(void 0, void 0, void 0, function () {
100
99
  return __generator(this, function (_a) {
101
100
  return [2 /*return*/, new Promise(function (resolve) { return setTimeout(resolve, ms); })];
@@ -110,7 +109,7 @@ exports.timeout = timeout;
110
109
  * @param ignoredModels - Array of model names to skip validation for
111
110
  * @throws Error if any model is not set to strict mode or missing virtual settings
112
111
  */
113
- function checkModelsStrict(ignoredModels) {
112
+ var checkModelsStrict = function (ignoredModels) {
114
113
  var e_1, _a;
115
114
  var _b, _c;
116
115
  if (ignoredModels === void 0) { ignoredModels = []; }
@@ -140,4 +139,5 @@ function checkModelsStrict(ignoredModels) {
140
139
  }
141
140
  finally { if (e_1) throw e_1.error; }
142
141
  }
143
- }
142
+ };
143
+ exports.checkModelsStrict = checkModelsStrict;
package/package.json CHANGED
@@ -100,8 +100,9 @@
100
100
  "lint:unsafefix": "biome check --fix --unsafe ./src",
101
101
  "test": "bun test --preload ./src/tests/bunSetup.ts --update-snapshots",
102
102
  "test:ci": "bun test --preload ./src/tests/bunSetup.ts",
103
+ "test:coverage": "bun run ../scripts/check-coverage.ts",
103
104
  "updateSnapshot": "bun test --update-snapshots"
104
105
  },
105
106
  "types": "dist/index.d.ts",
106
- "version": "0.9.3"
107
+ "version": "0.11.0"
107
108
  }