@terreno/api 0.20.2 → 0.22.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 (107) hide show
  1. package/.ai/guidelines/core.md +71 -0
  2. package/.ai/skills/mongoose-schema-safety/SKILL.md +143 -0
  3. package/README.md +54 -1
  4. package/bunfig.toml +1 -1
  5. package/dist/__tests__/versionCheckPlugin.test.js +29 -7
  6. package/dist/actions.openApi.test.js +13 -11
  7. package/dist/api.js +98 -11
  8. package/dist/api.query.test.js +31 -1
  9. package/dist/api.test.js +211 -0
  10. package/dist/auth.test.js +418 -43
  11. package/dist/betterAuth.d.ts +1 -1
  12. package/dist/consentApp.test.js +1 -0
  13. package/dist/example.js +4 -4
  14. package/dist/expressServer.d.ts +0 -22
  15. package/dist/expressServer.js +1 -125
  16. package/dist/expressServer.test.js +90 -91
  17. package/dist/githubAuth.test.js +22 -22
  18. package/dist/logger.d.ts +154 -0
  19. package/dist/logger.js +445 -26
  20. package/dist/logger.test.js +435 -0
  21. package/dist/middleware.d.ts +7 -0
  22. package/dist/middleware.js +58 -1
  23. package/dist/middleware.test.js +159 -0
  24. package/dist/models/consentForm.js +2 -1
  25. package/dist/models/consentResponse.js +2 -1
  26. package/dist/models/versionConfig.js +2 -1
  27. package/dist/openApi.test.js +10 -17
  28. package/dist/openApiBuilder.d.ts +18 -0
  29. package/dist/openApiBuilder.js +21 -0
  30. package/dist/openApiBuilder.test.js +34 -10
  31. package/dist/permissions.test.js +10 -43
  32. package/dist/populate.test.js +10 -42
  33. package/dist/realtime/changeStreamWatcher.d.ts +4 -4
  34. package/dist/realtime/changeStreamWatcher.js +2 -4
  35. package/dist/realtime/queryMatcher.d.ts +1 -1
  36. package/dist/realtime/queryMatcher.js +39 -14
  37. package/dist/realtime/types.d.ts +3 -3
  38. package/dist/requestContext.d.ts +61 -0
  39. package/dist/requestContext.js +74 -0
  40. package/dist/secretProviders.test.js +335 -0
  41. package/dist/syncConsents.test.js +2 -2
  42. package/dist/terrenoApp.d.ts +27 -15
  43. package/dist/terrenoApp.js +24 -14
  44. package/dist/terrenoApp.test.js +52 -0
  45. package/dist/tests/bunSetup.js +66 -262
  46. package/dist/tests/createTestData.d.ts +9 -0
  47. package/dist/tests/createTestData.js +272 -0
  48. package/dist/tests/models.d.ts +71 -0
  49. package/dist/tests/models.js +134 -0
  50. package/dist/tests/mongoTestSetup.d.ts +7 -0
  51. package/dist/tests/mongoTestSetup.js +150 -0
  52. package/dist/tests/testEnv.d.ts +0 -0
  53. package/dist/tests/testEnv.js +6 -0
  54. package/dist/tests/testHelper.d.ts +22 -0
  55. package/dist/tests/testHelper.js +115 -0
  56. package/dist/tests/types.d.ts +29 -0
  57. package/dist/tests/types.js +2 -0
  58. package/dist/tests.d.ts +10 -78
  59. package/dist/tests.js +24 -241
  60. package/dist/transformers.test.js +14 -50
  61. package/package.json +18 -4
  62. package/src/__snapshots__/openApiBuilder.test.ts.snap +1 -0
  63. package/src/__tests__/versionCheckPlugin.test.ts +43 -15
  64. package/src/actions.openApi.test.ts +12 -10
  65. package/src/api.query.test.ts +24 -1
  66. package/src/api.test.ts +169 -0
  67. package/src/api.ts +71 -0
  68. package/src/auth.test.ts +287 -39
  69. package/src/betterAuth.ts +1 -1
  70. package/src/consentApp.test.ts +1 -0
  71. package/src/example.ts +4 -4
  72. package/src/expressServer.test.ts +82 -85
  73. package/src/expressServer.ts +1 -213
  74. package/src/githubAuth.test.ts +22 -22
  75. package/src/logger.test.ts +466 -1
  76. package/src/logger.ts +477 -14
  77. package/src/middleware.test.ts +74 -2
  78. package/src/middleware.ts +57 -0
  79. package/src/models/consentForm.ts +3 -4
  80. package/src/models/consentResponse.ts +6 -4
  81. package/src/models/versionConfig.ts +3 -4
  82. package/src/openApi.test.ts +10 -17
  83. package/src/openApiBuilder.test.ts +27 -10
  84. package/src/openApiBuilder.ts +24 -0
  85. package/src/permissions.test.ts +8 -23
  86. package/src/populate.test.ts +7 -22
  87. package/src/realtime/changeStreamWatcher.ts +15 -10
  88. package/src/realtime/queryMatcher.ts +54 -27
  89. package/src/realtime/types.ts +4 -4
  90. package/src/requestContext.ts +86 -0
  91. package/src/secretProviders.test.ts +219 -1
  92. package/src/syncConsents.test.ts +1 -1
  93. package/src/terrenoApp.test.ts +38 -0
  94. package/src/terrenoApp.ts +37 -15
  95. package/src/tests/bunSetup.ts +22 -236
  96. package/src/tests/createTestData.ts +176 -0
  97. package/src/tests/models.ts +164 -0
  98. package/src/tests/mongoTestSetup.ts +69 -0
  99. package/src/tests/testEnv.ts +4 -0
  100. package/src/tests/testHelper.ts +57 -0
  101. package/src/tests/types.ts +35 -0
  102. package/src/tests.ts +40 -231
  103. package/src/transformers.test.ts +11 -30
  104. package/tsconfig.typedoc.json +4 -0
  105. package/dist/tests/index.d.ts +0 -1
  106. package/dist/tests/index.js +0 -17
  107. package/src/tests/index.ts +0 -1
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
36
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
37
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -35,269 +68,40 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
35
68
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
69
  }
37
70
  };
38
- var __read = (this && this.__read) || function (o, n) {
39
- var m = typeof Symbol === "function" && o[Symbol.iterator];
40
- if (!m) return o;
41
- var i = m.call(o), r, ar = [], e;
42
- try {
43
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
44
- }
45
- catch (error) { e = { error: error }; }
46
- finally {
47
- try {
48
- if (r && !r.done && (m = i["return"])) m.call(i);
49
- }
50
- finally { if (e) throw e.error; }
51
- }
52
- return ar;
53
- };
54
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
55
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
56
- if (ar || !(i in from)) {
57
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
58
- ar[i] = from[i];
59
- }
60
- }
61
- return to.concat(ar || Array.prototype.slice.call(from));
62
- };
63
- var __importDefault = (this && this.__importDefault) || function (mod) {
64
- return (mod && mod.__esModule) ? mod : { "default": mod };
65
- };
66
71
  Object.defineProperty(exports, "__esModule", { value: true });
67
- // biome-ignore-all lint/suspicious/noExplicitAny: test mock typing
68
- var bun_test_1 = require("bun:test");
69
- var node_stream_1 = require("node:stream");
70
- var mongoose_1 = __importDefault(require("mongoose"));
71
- var winston_1 = __importDefault(require("winston"));
72
- var expressServer_1 = require("../expressServer");
73
- var logger_1 = require("../logger");
74
- var shouldConnectToTestDb = process.env.BUN_TEST_DISABLE_DB !== "true";
75
- // Connect to MongoDB once for all tests
76
- if (shouldConnectToTestDb) {
77
- (0, bun_test_1.beforeAll)(function () { return __awaiter(void 0, void 0, void 0, function () {
78
- return __generator(this, function (_a) {
79
- switch (_a.label) {
80
- case 0: return [4 /*yield*/, mongoose_1.default
81
- .connect("mongodb://127.0.0.1/terreno?&connectTimeoutMS=360000")
82
- .catch(logger_1.logger.catch)];
83
- case 1:
84
- _a.sent();
85
- return [2 /*return*/];
86
- }
87
- });
88
- }); });
89
- }
90
- // Close MongoDB connection after all tests
91
- if (shouldConnectToTestDb) {
92
- (0, bun_test_1.afterAll)(function () { return __awaiter(void 0, void 0, void 0, function () {
93
- return __generator(this, function (_a) {
94
- switch (_a.label) {
95
- case 0: return [4 /*yield*/, mongoose_1.default.connection.close()];
96
- case 1:
97
- _a.sent();
98
- return [2 /*return*/];
99
- }
100
- });
101
- }); });
102
- }
103
- var logs = [];
104
- var SHOW_ALL_LOGS = process.env.SHOW_ALL_TEST_LOGS === "true";
105
- // Create a custom stream that captures logs
106
- var logStream = new node_stream_1.Writable({
107
- write: function (chunk, _encoding, callback) {
108
- logs.push(chunk.toString());
109
- if (SHOW_ALL_LOGS) {
110
- process.stdout.write(chunk);
111
- }
112
- callback();
113
- },
114
- });
115
- // Silence both winston loggers by replacing all transports with our capturing stream
116
- var silentTransport = new winston_1.default.transports.Stream({
117
- format: winston_1.default.format.simple(),
118
- stream: logStream,
119
- });
120
- // Clear and silence the default winston logger
121
- winston_1.default.clear();
122
- winston_1.default.add(silentTransport);
123
- // Clear and silence the custom winstonLogger
124
- logger_1.winstonLogger.clear();
125
- logger_1.winstonLogger.add(silentTransport);
126
- // Capture and silence console methods
127
- var originalConsole = {
128
- debug: console.debug,
129
- error: console.error,
130
- info: console.info,
131
- // biome-ignore lint/suspicious/noConsole: We keep the original reference.
132
- log: console.log,
133
- warn: console.warn,
134
- };
135
- var captureConsoleMethod = function (method) {
136
- console[method] = function () {
137
- var args = [];
138
- for (var _i = 0; _i < arguments.length; _i++) {
139
- args[_i] = arguments[_i];
140
- }
141
- var logMessage = "[console.".concat(method, "] ").concat(args.map(function (arg) { return (typeof arg === "object" ? JSON.stringify(arg) : String(arg)); }).join(" "));
142
- logs.push(logMessage);
143
- if (SHOW_ALL_LOGS) {
144
- originalConsole[method].apply(originalConsole, __spreadArray([], __read(args), false));
145
- }
146
- };
147
- };
148
- captureConsoleMethod("log");
149
- captureConsoleMethod("info");
150
- captureConsoleMethod("warn");
151
- captureConsoleMethod("error");
152
- captureConsoleMethod("debug");
153
- // Setup before each test
154
- (0, bun_test_1.beforeEach)(function () {
155
- process.env.TOKEN_SECRET = "secret";
156
- process.env.TOKEN_ISSUER = "terreno-api.test";
157
- process.env.SESSION_SECRET = "sessionSecret";
158
- process.env.REFRESH_TOKEN_SECRET = "refreshTokenSecret";
159
- (0, expressServer_1.setupEnvironment)();
160
- // Re-silence loggers after setupEnvironment which may reconfigure them
161
- winston_1.default.clear();
162
- winston_1.default.add(silentTransport);
163
- logger_1.winstonLogger.clear();
164
- logger_1.winstonLogger.add(silentTransport);
165
- logs = [];
166
- });
167
- // Clear logs after each test
168
- (0, bun_test_1.afterEach)(function () {
169
- logs = [];
170
- });
171
- // Mock @sentry/bun module
172
- bun_test_1.mock.module("@sentry/bun", function () {
173
- var mockFn = function () { return (0, bun_test_1.mock)(function () { }); };
174
- // Mock Scope
175
- var mockScope = {
176
- addBreadcrumb: mockFn(),
177
- clear: mockFn(),
178
- getSpan: mockFn(),
179
- setContext: mockFn(),
180
- setFingerprint: mockFn(),
181
- setLevel: mockFn(),
182
- setSpan: mockFn(),
183
- setTag: mockFn(),
184
- setTags: mockFn(),
185
- setTransactionName: mockFn(),
186
- setUser: mockFn(),
187
- };
188
- // Mock Hub
189
- var mockClient = {
190
- captureException: mockFn(),
191
- captureMessage: mockFn(),
192
- close: (0, bun_test_1.mock)(function () { return Promise.resolve(true); }),
193
- flush: (0, bun_test_1.mock)(function () { return Promise.resolve(true); }),
194
- getOptions: (0, bun_test_1.mock)(function () { return ({}); }),
195
- };
196
- var mockHub = {
197
- addBreadcrumb: mockFn(),
198
- captureException: mockFn(),
199
- captureMessage: mockFn(),
200
- configureScope: mockFn(),
201
- getClient: (0, bun_test_1.mock)(function () { return mockClient; }),
202
- getScope: (0, bun_test_1.mock)(function () { return mockScope; }),
203
- popScope: mockFn(),
204
- pushScope: mockFn(),
205
- setContext: mockFn(),
206
- setTag: mockFn(),
207
- setTags: mockFn(),
208
- setUser: mockFn(),
209
- withScope: mockFn(),
210
- };
211
- var mockSpan = {
212
- finish: mockFn(),
213
- setData: mockFn(),
214
- setStatus: mockFn(),
215
- setTag: mockFn(),
216
- startChild: mockFn(),
217
- toTraceparent: (0, bun_test_1.mock)(function () { return "mock-trace-parent"; }),
218
- };
219
- mockSpan.startChild = (0, bun_test_1.mock)(function () { return mockSpan; });
220
- var mockTransaction = {
221
- finish: mockFn(),
222
- setData: mockFn(),
223
- setName: mockFn(),
224
- setStatus: mockFn(),
225
- setTag: mockFn(),
226
- startChild: (0, bun_test_1.mock)(function () { return mockSpan; }),
227
- toTraceparent: (0, bun_test_1.mock)(function () { return "mock-trace-parent"; }),
228
- };
229
- return {
230
- addBreadcrumb: mockFn(),
231
- captureException: mockFn(),
232
- captureMessage: mockFn(),
233
- clearScope: mockFn(),
234
- close: (0, bun_test_1.mock)(function () { return Promise.resolve(true); }),
235
- configureScope: mockFn(),
236
- default: {
237
- addBreadcrumb: mockFn(),
238
- captureException: mockFn(),
239
- captureMessage: mockFn(),
240
- clearScope: mockFn(),
241
- close: (0, bun_test_1.mock)(function () { return Promise.resolve(true); }),
242
- configureScope: mockFn(),
243
- flush: (0, bun_test_1.mock)(function () { return Promise.resolve(true); }),
244
- getClient: (0, bun_test_1.mock)(function () { return mockClient; }),
245
- getCurrentHub: (0, bun_test_1.mock)(function () { return mockHub; }),
246
- getCurrentScope: (0, bun_test_1.mock)(function () { return mockScope; }),
247
- Handlers: {
248
- errorHandler: (0, bun_test_1.mock)(function () { return function (err, _req, _res, next) { return next(err); }; }),
249
- requestHandler: (0, bun_test_1.mock)(function () { return function (_req, _res, next) { return next(); }; }),
250
- tracingHandler: (0, bun_test_1.mock)(function () { return function (_req, _res, next) { return next(); }; }),
251
- },
252
- init: mockFn(),
253
- isInitialized: (0, bun_test_1.mock)(function () { return true; }),
254
- popScope: mockFn(),
255
- pushScope: mockFn(),
256
- Severity: {
257
- Debug: "debug",
258
- Error: "error",
259
- Fatal: "fatal",
260
- Info: "info",
261
- Warning: "warning",
262
- },
263
- setContext: mockFn(),
264
- setFingerprint: mockFn(),
265
- setLevel: mockFn(),
266
- setTag: mockFn(),
267
- setTags: mockFn(),
268
- setUser: mockFn(),
269
- setupExpressErrorHandler: mockFn(),
270
- startTransaction: (0, bun_test_1.mock)(function () { return mockTransaction; }),
271
- withScope: (0, bun_test_1.mock)(function (callback) { return callback(mockScope); }),
72
+ var test_1 = require("@terreno/test");
73
+ var useFixtureCache = process.env.TERRENO_TEST_USE_FIXTURE_CACHE === "true";
74
+ if (useFixtureCache) {
75
+ (0, test_1.registerBackendPreload)({
76
+ connectMongoInBeforeAll: true,
77
+ loadTestDataFromCache: function () { return __awaiter(void 0, void 0, void 0, function () {
78
+ var loadTestDataFromCache;
79
+ return __generator(this, function (_a) {
80
+ switch (_a.label) {
81
+ case 0: return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require("./mongoTestSetup")); })];
82
+ case 1:
83
+ loadTestDataFromCache = (_a.sent()).loadTestDataFromCache;
84
+ return [4 /*yield*/, loadTestDataFromCache()];
85
+ case 2:
86
+ _a.sent();
87
+ return [2 /*return*/];
88
+ }
89
+ });
90
+ }); },
91
+ mongo: {
92
+ baseDatabaseName: "terrenoTest_base",
93
+ useReplSet: true,
272
94
  },
273
- flush: (0, bun_test_1.mock)(function () { return Promise.resolve(true); }),
274
- getClient: (0, bun_test_1.mock)(function () { return mockClient; }),
275
- getCurrentHub: (0, bun_test_1.mock)(function () { return mockHub; }),
276
- getCurrentScope: (0, bun_test_1.mock)(function () { return mockScope; }),
277
- Handlers: {
278
- errorHandler: (0, bun_test_1.mock)(function () { return function (err, _req, _res, next) { return next(err); }; }),
279
- requestHandler: (0, bun_test_1.mock)(function () { return function (_req, _res, next) { return next(); }; }),
280
- tracingHandler: (0, bun_test_1.mock)(function () { return function (_req, _res, next) { return next(); }; }),
95
+ testEnv: {
96
+ tokenIssuer: "terreno-api.test",
281
97
  },
282
- init: mockFn(),
283
- isInitialized: (0, bun_test_1.mock)(function () { return true; }),
284
- popScope: mockFn(),
285
- pushScope: mockFn(),
286
- Severity: {
287
- Debug: "debug",
288
- Error: "error",
289
- Fatal: "fatal",
290
- Info: "info",
291
- Warning: "warning",
98
+ useTransactions: true,
99
+ });
100
+ }
101
+ else {
102
+ (0, test_1.registerSimpleMongoPreload)({
103
+ testEnv: {
104
+ tokenIssuer: "terreno-api.test",
292
105
  },
293
- setContext: mockFn(),
294
- setFingerprint: mockFn(),
295
- setLevel: mockFn(),
296
- setTag: mockFn(),
297
- setTags: mockFn(),
298
- setUser: mockFn(),
299
- setupExpressErrorHandler: mockFn(),
300
- startTransaction: (0, bun_test_1.mock)(function () { return mockTransaction; }),
301
- withScope: (0, bun_test_1.mock)(function (callback) { return callback(mockScope); }),
302
- };
303
- });
106
+ });
107
+ }
@@ -0,0 +1,9 @@
1
+ import type { CachedTestData, TestData, TestFoods, TestRequired, TestUsers } from "./types";
2
+ export declare const clearTestCollections: () => Promise<void>;
3
+ export declare const createTestUsers: () => Promise<TestUsers>;
4
+ export declare const createStandardFoods: (users: TestUsers) => Promise<TestFoods>;
5
+ export declare const createRequiredFixtures: () => Promise<TestRequired>;
6
+ /** Builds the standard Terreno API test database (users, foods, required docs). */
7
+ export declare const createTestData: () => Promise<TestData>;
8
+ export declare const toCachedTestData: (testData: TestData) => CachedTestData;
9
+ export declare const loadTestDataFromDocuments: (cached: CachedTestData) => Promise<TestData>;
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ 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);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __read = (this && this.__read) || function (o, n) {
39
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
40
+ if (!m) return o;
41
+ var i = m.call(o), r, ar = [], e;
42
+ try {
43
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
44
+ }
45
+ catch (error) { e = { error: error }; }
46
+ finally {
47
+ try {
48
+ if (r && !r.done && (m = i["return"])) m.call(i);
49
+ }
50
+ finally { if (e) throw e.error; }
51
+ }
52
+ return ar;
53
+ };
54
+ Object.defineProperty(exports, "__esModule", { value: true });
55
+ exports.loadTestDataFromDocuments = exports.toCachedTestData = exports.createTestData = exports.createRequiredFixtures = exports.createStandardFoods = exports.createTestUsers = exports.clearTestCollections = void 0;
56
+ var logger_1 = require("../logger");
57
+ var models_1 = require("./models");
58
+ var setPassword = function (user, password) { return __awaiter(void 0, void 0, void 0, function () {
59
+ return __generator(this, function (_a) {
60
+ switch (_a.label) {
61
+ case 0: return [4 /*yield*/, user.setPassword(password)];
62
+ case 1:
63
+ _a.sent();
64
+ return [4 /*yield*/, user.save()];
65
+ case 2:
66
+ _a.sent();
67
+ return [2 /*return*/];
68
+ }
69
+ });
70
+ }); };
71
+ var clearTestCollections = function () { return __awaiter(void 0, void 0, void 0, function () {
72
+ return __generator(this, function (_a) {
73
+ switch (_a.label) {
74
+ case 0: return [4 /*yield*/, Promise.all([
75
+ models_1.UserModel.deleteMany({}),
76
+ models_1.FoodModel.deleteMany({}),
77
+ models_1.RequiredModel.deleteMany({}),
78
+ ]).catch(logger_1.logger.catch)];
79
+ case 1:
80
+ _a.sent();
81
+ return [2 /*return*/];
82
+ }
83
+ });
84
+ }); };
85
+ exports.clearTestCollections = clearTestCollections;
86
+ var createTestUsers = function () { return __awaiter(void 0, void 0, void 0, function () {
87
+ var _a, notAdmin, admin, adminOther;
88
+ return __generator(this, function (_b) {
89
+ switch (_b.label) {
90
+ case 0: return [4 /*yield*/, Promise.all([
91
+ models_1.UserModel.create({ email: "notAdmin@example.com", name: "Not Admin" }),
92
+ models_1.UserModel.create({ admin: true, email: "admin@example.com", name: "Admin" }),
93
+ models_1.UserModel.create({ admin: true, email: "admin+other@example.com", name: "Admin Other" }),
94
+ ])];
95
+ case 1:
96
+ _a = __read.apply(void 0, [_b.sent(), 3]), notAdmin = _a[0], admin = _a[1], adminOther = _a[2];
97
+ return [4 /*yield*/, Promise.all([
98
+ setPassword(notAdmin, "password"),
99
+ setPassword(admin, "securePassword"),
100
+ setPassword(adminOther, "otherPassword"),
101
+ ])];
102
+ case 2:
103
+ _b.sent();
104
+ return [2 /*return*/, { admin: admin, adminOther: adminOther, notAdmin: notAdmin }];
105
+ }
106
+ });
107
+ }); };
108
+ exports.createTestUsers = createTestUsers;
109
+ var createStandardFoods = function (users) { return __awaiter(void 0, void 0, void 0, function () {
110
+ var admin, adminOther, notAdmin, _a, spinach, apple, carrots, pizza;
111
+ return __generator(this, function (_b) {
112
+ switch (_b.label) {
113
+ case 0:
114
+ admin = users.admin, adminOther = users.adminOther, notAdmin = users.notAdmin;
115
+ return [4 /*yield*/, Promise.all([
116
+ models_1.FoodModel.create({
117
+ calories: 1,
118
+ categories: [{ name: "Vegetables", show: true }],
119
+ created: new Date("2021-12-03T00:00:20.000Z"),
120
+ eatenBy: [admin._id],
121
+ expiration: "2026-12-31",
122
+ hidden: false,
123
+ lastEatenWith: {
124
+ dressing: new Date("2021-12-03T19:00:30.000Z"),
125
+ },
126
+ likesIds: [
127
+ { likes: true, userId: admin._id },
128
+ { likes: false, userId: notAdmin._id },
129
+ ],
130
+ name: "Spinach",
131
+ ownerId: notAdmin._id,
132
+ source: {
133
+ dateAdded: "2023-12-13T12:30:00.000Z",
134
+ href: "https://www.example.com/spinach",
135
+ name: "Brand",
136
+ },
137
+ tags: ["healthy"],
138
+ }),
139
+ models_1.FoodModel.create({
140
+ calories: 100,
141
+ created: new Date("2021-12-03T00:00:30.000Z"),
142
+ expiration: "2026-12-31",
143
+ hidden: true,
144
+ likesIds: [{ likes: true, userId: admin._id }],
145
+ name: "Apple",
146
+ ownerId: admin._id,
147
+ source: { name: "Orchard" },
148
+ tags: ["healthy"],
149
+ }),
150
+ models_1.FoodModel.create({
151
+ calories: 100,
152
+ created: new Date("2021-12-03T00:00:00.000Z"),
153
+ eatenBy: [admin._id, notAdmin._id],
154
+ expiration: "2026-12-31",
155
+ hidden: false,
156
+ likesIds: [{ likes: false, userId: notAdmin._id }],
157
+ name: "Carrots",
158
+ ownerId: admin._id,
159
+ source: { name: "Farm" },
160
+ tags: ["vegetable"],
161
+ }),
162
+ models_1.FoodModel.create({
163
+ calories: 800,
164
+ created: new Date("2022-01-01T00:00:00.000Z"),
165
+ expiration: "2026-12-31",
166
+ hidden: false,
167
+ likesIds: [{ likes: true, userId: adminOther._id }],
168
+ name: "Pizza",
169
+ ownerId: adminOther._id,
170
+ source: { name: "Pizzeria" },
171
+ tags: ["comfort"],
172
+ }),
173
+ ])];
174
+ case 1:
175
+ _a = __read.apply(void 0, [_b.sent(), 4]), spinach = _a[0], apple = _a[1], carrots = _a[2], pizza = _a[3];
176
+ return [2 /*return*/, { apple: apple, carrots: carrots, pizza: pizza, spinach: spinach }];
177
+ }
178
+ });
179
+ }); };
180
+ exports.createStandardFoods = createStandardFoods;
181
+ var createRequiredFixtures = function () { return __awaiter(void 0, void 0, void 0, function () {
182
+ var _a, sample, withAbout;
183
+ return __generator(this, function (_b) {
184
+ switch (_b.label) {
185
+ case 0: return [4 /*yield*/, Promise.all([
186
+ models_1.RequiredModel.create({ name: "Sample Required" }),
187
+ models_1.RequiredModel.create({ about: "Optional about text", name: "Required With About" }),
188
+ ])];
189
+ case 1:
190
+ _a = __read.apply(void 0, [_b.sent(), 2]), sample = _a[0], withAbout = _a[1];
191
+ return [2 /*return*/, { sample: sample, withAbout: withAbout }];
192
+ }
193
+ });
194
+ }); };
195
+ exports.createRequiredFixtures = createRequiredFixtures;
196
+ /** Builds the standard Terreno API test database (users, foods, required docs). */
197
+ var createTestData = function () { return __awaiter(void 0, void 0, void 0, function () {
198
+ var users, _a, foods, required;
199
+ return __generator(this, function (_b) {
200
+ switch (_b.label) {
201
+ case 0: return [4 /*yield*/, (0, exports.clearTestCollections)()];
202
+ case 1:
203
+ _b.sent();
204
+ return [4 /*yield*/, (0, exports.createTestUsers)()];
205
+ case 2:
206
+ users = _b.sent();
207
+ return [4 /*yield*/, Promise.all([
208
+ (0, exports.createStandardFoods)(users),
209
+ (0, exports.createRequiredFixtures)(),
210
+ ])];
211
+ case 3:
212
+ _a = __read.apply(void 0, [_b.sent(), 2]), foods = _a[0], required = _a[1];
213
+ return [2 /*return*/, { foods: foods, required: required, users: users }];
214
+ }
215
+ });
216
+ }); };
217
+ exports.createTestData = createTestData;
218
+ var toCachedTestData = function (testData) { return ({
219
+ foods: {
220
+ apple: testData.foods.apple.id,
221
+ carrots: testData.foods.carrots.id,
222
+ pizza: testData.foods.pizza.id,
223
+ spinach: testData.foods.spinach.id,
224
+ },
225
+ required: {
226
+ sample: testData.required.sample.id,
227
+ withAbout: testData.required.withAbout.id,
228
+ },
229
+ users: {
230
+ admin: testData.users.admin.id,
231
+ adminOther: testData.users.adminOther.id,
232
+ notAdmin: testData.users.notAdmin.id,
233
+ },
234
+ }); };
235
+ exports.toCachedTestData = toCachedTestData;
236
+ var loadTestDataFromDocuments = function (cached) { return __awaiter(void 0, void 0, void 0, function () {
237
+ var _a, admin, notAdmin, adminOther, spinach, apple, carrots, pizza, sample, withAbout;
238
+ return __generator(this, function (_b) {
239
+ switch (_b.label) {
240
+ case 0: return [4 /*yield*/, Promise.all([
241
+ models_1.UserModel.findById(cached.users.admin),
242
+ models_1.UserModel.findById(cached.users.notAdmin),
243
+ models_1.UserModel.findById(cached.users.adminOther),
244
+ models_1.FoodModel.findById(cached.foods.spinach),
245
+ models_1.FoodModel.findById(cached.foods.apple),
246
+ models_1.FoodModel.findById(cached.foods.carrots),
247
+ models_1.FoodModel.findById(cached.foods.pizza),
248
+ models_1.RequiredModel.findById(cached.required.sample),
249
+ models_1.RequiredModel.findById(cached.required.withAbout),
250
+ ])];
251
+ case 1:
252
+ _a = __read.apply(void 0, [_b.sent(), 9]), admin = _a[0], notAdmin = _a[1], adminOther = _a[2], spinach = _a[3], apple = _a[4], carrots = _a[5], pizza = _a[6], sample = _a[7], withAbout = _a[8];
253
+ if (!admin ||
254
+ !notAdmin ||
255
+ !adminOther ||
256
+ !spinach ||
257
+ !apple ||
258
+ !carrots ||
259
+ !pizza ||
260
+ !sample ||
261
+ !withAbout) {
262
+ throw new Error("[createTestData] Cached test data references missing documents");
263
+ }
264
+ return [2 /*return*/, {
265
+ foods: { apple: apple, carrots: carrots, pizza: pizza, spinach: spinach },
266
+ required: { sample: sample, withAbout: withAbout },
267
+ users: { admin: admin, adminOther: adminOther, notAdmin: notAdmin },
268
+ }];
269
+ }
270
+ });
271
+ }); };
272
+ exports.loadTestDataFromDocuments = loadTestDataFromDocuments;