@casual-simulation/aux-records 3.6.0 → 3.7.0-alpha.16977445547

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 (74) hide show
  1. package/DataRecordsController.d.ts +4 -0
  2. package/DataRecordsController.js +21 -0
  3. package/DataRecordsController.js.map +1 -1
  4. package/DataRecordsStore.d.ts +5 -0
  5. package/DataRecordsStore.js.map +1 -1
  6. package/PolicyController.js +2 -1
  7. package/PolicyController.js.map +1 -1
  8. package/PolicyStore.d.ts +13 -0
  9. package/PolicyStore.js +16 -0
  10. package/PolicyStore.js.map +1 -1
  11. package/RecordsServer.d.ts +142 -4
  12. package/RecordsServer.js +205 -1
  13. package/RecordsServer.js.map +1 -1
  14. package/ServerConfig.d.ts +447 -0
  15. package/ServerConfig.js +54 -0
  16. package/ServerConfig.js.map +1 -1
  17. package/SubscriptionConfigBuilder.d.ts +3 -1
  18. package/SubscriptionConfigBuilder.js +10 -0
  19. package/SubscriptionConfigBuilder.js.map +1 -1
  20. package/SubscriptionConfiguration.d.ts +229 -0
  21. package/SubscriptionConfiguration.js +35 -0
  22. package/SubscriptionConfiguration.js.map +1 -1
  23. package/crud/CrudRecordsController.d.ts +12 -8
  24. package/crud/CrudRecordsController.js +29 -12
  25. package/crud/CrudRecordsController.js.map +1 -1
  26. package/crud/CrudRecordsControllerTests.d.ts +5 -5
  27. package/crud/CrudRecordsControllerTests.js +128 -69
  28. package/crud/CrudRecordsControllerTests.js.map +1 -1
  29. package/index.d.ts +1 -0
  30. package/index.js +1 -0
  31. package/index.js.map +1 -1
  32. package/notifications/NotificationRecordsController.d.ts +1 -1
  33. package/notifications/NotificationRecordsController.js.map +1 -1
  34. package/package.json +4 -3
  35. package/packages/PackageRecordsController.d.ts +1 -1
  36. package/packages/PackageRecordsController.js.map +1 -1
  37. package/queue/MemoryQueue.d.ts +24 -0
  38. package/queue/MemoryQueue.js +45 -0
  39. package/queue/MemoryQueue.js.map +1 -0
  40. package/queue/Queue.d.ts +12 -0
  41. package/queue/Queue.js +19 -0
  42. package/queue/Queue.js.map +1 -0
  43. package/queue/index.d.ts +2 -0
  44. package/queue/index.js +19 -0
  45. package/queue/index.js.map +1 -0
  46. package/search/MemorySearchInterface.d.ts +25 -0
  47. package/search/MemorySearchInterface.js +192 -0
  48. package/search/MemorySearchInterface.js.map +1 -0
  49. package/search/MemorySearchRecordsStore.d.ts +21 -0
  50. package/search/MemorySearchRecordsStore.js +80 -0
  51. package/search/MemorySearchRecordsStore.js.map +1 -0
  52. package/search/SearchInterface.d.ts +329 -0
  53. package/search/SearchInterface.js +19 -0
  54. package/search/SearchInterface.js.map +1 -0
  55. package/search/SearchRecordsController.d.ts +491 -0
  56. package/search/SearchRecordsController.js +521 -0
  57. package/search/SearchRecordsController.js.map +1 -0
  58. package/search/SearchRecordsStore.d.ts +176 -0
  59. package/search/SearchRecordsStore.js +2 -0
  60. package/search/SearchRecordsStore.js.map +1 -0
  61. package/search/SearchSyncProcessor.d.ts +162 -0
  62. package/search/SearchSyncProcessor.js +256 -0
  63. package/search/SearchSyncProcessor.js.map +1 -0
  64. package/search/TypesenseSearchInterface.d.ts +18 -0
  65. package/search/TypesenseSearchInterface.js +171 -0
  66. package/search/TypesenseSearchInterface.js.map +1 -0
  67. package/search/index.d.ts +7 -0
  68. package/search/index.js +24 -0
  69. package/search/index.js.map +1 -0
  70. package/webhooks/WebhookRecordsController.d.ts +3 -3
  71. package/webhooks/WebhookRecordsController.js +3 -3
  72. package/webhooks/WebhookRecordsController.js.map +1 -1
  73. package/websockets/WebsocketController.js +30 -25
  74. package/websockets/WebsocketController.js.map +1 -1
@@ -0,0 +1,521 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { failure, isFailure, PUBLIC_READ_MARKER, RESOURCE_KIND_VALIDATION, success, } from '@casual-simulation/aux-common';
8
+ import { CrudRecordsController } from '../crud';
9
+ import { getSearchFeatures } from '../SubscriptionConfiguration';
10
+ import { z } from 'zod';
11
+ import { v4 as uuid } from 'uuid';
12
+ import { traced } from '../tracing/TracingDecorators';
13
+ import { ADDRESS_VALIDATION, RECORD_NAME_VALIDATION } from '../Validations';
14
+ const TRACE_NAME = 'SearchRecordsController';
15
+ /**
16
+ * Defines a controller that can be used to interact with SearchRecords.
17
+ */
18
+ export class SearchRecordsController extends CrudRecordsController {
19
+ constructor(config) {
20
+ super({
21
+ ...config,
22
+ name: 'SearchRecordsController',
23
+ resourceKind: 'search',
24
+ });
25
+ this._searchInterface = config.searchInterface;
26
+ this._queue = config.queue;
27
+ }
28
+ async _eraseItemCore(recordName, address, item, authorization) {
29
+ const result = await super._eraseItemCore(recordName, address, item, authorization);
30
+ if (isFailure(result)) {
31
+ return result;
32
+ }
33
+ await this._searchInterface.dropCollection(item.collectionName);
34
+ return success();
35
+ }
36
+ async storeDocument(request) {
37
+ const contextResult = await this.policies.constructAuthorizationContext({
38
+ recordKeyOrRecordName: request.recordName,
39
+ userId: request.userId,
40
+ });
41
+ if (contextResult.success === false) {
42
+ return failure(contextResult);
43
+ }
44
+ const recordName = contextResult.context.recordName;
45
+ const record = await this.store.getItemByAddress(recordName, request.address);
46
+ if (!record) {
47
+ return failure({
48
+ errorCode: 'not_found',
49
+ errorMessage: `The Search record was not found.`,
50
+ });
51
+ }
52
+ const authorizationResult = await this.policies.authorizeUserAndInstances(contextResult.context, {
53
+ resourceKind: 'search',
54
+ resourceId: record.address,
55
+ action: 'update',
56
+ instances: request.instances,
57
+ userId: request.userId,
58
+ markers: record.markers,
59
+ });
60
+ if (authorizationResult.success === false) {
61
+ return failure(authorizationResult);
62
+ }
63
+ const result = await this._searchInterface.createDocument(record.collectionName, request.document, 'upsert');
64
+ return success(result);
65
+ }
66
+ async eraseDocument(request) {
67
+ const contextResult = await this.policies.constructAuthorizationContext({
68
+ recordKeyOrRecordName: request.recordName,
69
+ userId: request.userId,
70
+ });
71
+ if (contextResult.success === false) {
72
+ return failure(contextResult);
73
+ }
74
+ const recordName = contextResult.context.recordName;
75
+ const record = await this.store.getItemByAddress(recordName, request.address);
76
+ if (!record) {
77
+ return failure({
78
+ errorCode: 'not_found',
79
+ errorMessage: `The Search record was not found.`,
80
+ });
81
+ }
82
+ const authorizationResult = await this.policies.authorizeUserAndInstances(contextResult.context, {
83
+ resourceKind: 'search',
84
+ resourceId: record.address,
85
+ action: 'update',
86
+ instances: request.instances,
87
+ userId: request.userId,
88
+ markers: record.markers,
89
+ });
90
+ if (authorizationResult.success === false) {
91
+ return failure(authorizationResult);
92
+ }
93
+ const result = await this._searchInterface.deleteDocument(record.collectionName, request.documentId);
94
+ return result;
95
+ }
96
+ async sync(request) {
97
+ if (!this._queue) {
98
+ return failure({
99
+ errorCode: 'not_supported',
100
+ errorMessage: 'Syncing data to a search record is not supported.',
101
+ });
102
+ }
103
+ const searchContext = await this.policies.constructAuthorizationContext({
104
+ recordKeyOrRecordName: request.recordName,
105
+ userId: request.userId,
106
+ });
107
+ if (searchContext.success === false) {
108
+ return failure(searchContext);
109
+ }
110
+ const searchRecordName = searchContext.context.recordName;
111
+ const searchRecordAddress = request.address;
112
+ const searchRecord = await this.store.getItemByAddress(searchRecordName, searchRecordAddress);
113
+ if (!searchRecord) {
114
+ return failure({
115
+ errorCode: 'not_found',
116
+ errorMessage: `The Search record was not found.`,
117
+ });
118
+ }
119
+ const searchAuthorization = await this.policies.authorizeUserAndInstances(searchContext.context, {
120
+ resourceKind: 'search',
121
+ resourceId: request.address,
122
+ action: 'update',
123
+ markers: searchRecord.markers,
124
+ instances: request.instances,
125
+ userId: request.userId,
126
+ });
127
+ if (searchAuthorization.success === false) {
128
+ return failure(searchAuthorization);
129
+ }
130
+ const dataContext = await this.policies.constructAuthorizationContext({
131
+ recordKeyOrRecordName: request.targetRecordName,
132
+ userId: request.userId,
133
+ });
134
+ if (dataContext.success === false) {
135
+ return failure(dataContext);
136
+ }
137
+ const targetRecordName = dataContext.context.recordName;
138
+ const dataAuthorization = await this.policies.authorizeUserAndInstances(dataContext.context, {
139
+ resourceKind: request.targetResourceKind,
140
+ action: 'read',
141
+ markers: [request.targetMarker],
142
+ instances: request.instances,
143
+ userId: request.userId,
144
+ });
145
+ if (dataAuthorization.success === false) {
146
+ return failure(dataAuthorization);
147
+ }
148
+ const id = uuid();
149
+ const sync = {
150
+ id,
151
+ searchRecordName,
152
+ searchRecordAddress,
153
+ targetRecordName,
154
+ targetResourceKind: request.targetResourceKind,
155
+ targetMarker: request.targetMarker,
156
+ targetMapping: request.targetMapping,
157
+ };
158
+ await this.store.saveSync(sync);
159
+ await this._queue.add('syncSearchRecord', {
160
+ type: 'sync_search_record',
161
+ sync,
162
+ });
163
+ return success({
164
+ syncId: id,
165
+ });
166
+ }
167
+ async unsync(request) {
168
+ // First, retrieve the sync from the store
169
+ const sync = await this.store.getSync(request.syncId);
170
+ if (!sync) {
171
+ return failure({
172
+ errorCode: 'not_found',
173
+ errorMessage: 'The search record sync was not found.',
174
+ });
175
+ }
176
+ // Check permissions for the search record
177
+ const searchContext = await this.policies.constructAuthorizationContext({
178
+ recordKeyOrRecordName: sync.searchRecordName,
179
+ userId: request.userId,
180
+ });
181
+ if (searchContext.success === false) {
182
+ return failure(searchContext);
183
+ }
184
+ const searchRecord = await this.store.getItemByAddress(sync.searchRecordName, sync.searchRecordAddress);
185
+ if (!searchRecord) {
186
+ return failure({
187
+ errorCode: 'not_found',
188
+ errorMessage: 'The search record was not found.',
189
+ });
190
+ }
191
+ const searchAuthorization = await this.policies.authorizeUserAndInstances(searchContext.context, {
192
+ resourceKind: 'search',
193
+ resourceId: sync.searchRecordAddress,
194
+ action: 'update',
195
+ markers: searchRecord.markers,
196
+ instances: request.instances,
197
+ userId: request.userId,
198
+ });
199
+ if (searchAuthorization.success === false) {
200
+ return failure(searchAuthorization);
201
+ }
202
+ // Delete the sync if permissions are valid
203
+ await this.store.deleteSync(request.syncId);
204
+ return success();
205
+ }
206
+ async search(request) {
207
+ const contextResult = await this.policies.constructAuthorizationContext({
208
+ recordKeyOrRecordName: request.recordName,
209
+ userId: request.userId,
210
+ });
211
+ if (contextResult.success === false) {
212
+ return failure(contextResult);
213
+ }
214
+ const recordName = contextResult.context.recordName;
215
+ const record = await this.store.getItemByAddress(recordName, request.address);
216
+ if (!record) {
217
+ return failure({
218
+ errorCode: 'not_found',
219
+ errorMessage: `The Search record was not found.`,
220
+ });
221
+ }
222
+ const authorizationResult = await this.policies.authorizeUserAndInstances(contextResult.context, {
223
+ resourceKind: 'search',
224
+ resourceId: record.address,
225
+ action: 'read',
226
+ instances: request.instances,
227
+ userId: request.userId,
228
+ markers: record.markers,
229
+ });
230
+ if (authorizationResult.success === false) {
231
+ return failure(authorizationResult);
232
+ }
233
+ const result = await this._searchInterface.searchCollection(record.collectionName, request.query);
234
+ return result;
235
+ }
236
+ async _convertItemToResult(item, context, action) {
237
+ if (action === 'read') {
238
+ const schema = {};
239
+ if (item.collectionName) {
240
+ const collection = await this._searchInterface.getCollection(item.collectionName);
241
+ if (collection) {
242
+ for (let field of collection.fields) {
243
+ schema[field.name] = {
244
+ type: field.type,
245
+ optional: field.optional,
246
+ index: field.index,
247
+ store: field.store,
248
+ sort: field.sort,
249
+ infix: field.infix,
250
+ locale: field.locale,
251
+ stem: field.stem,
252
+ facet: field.facet,
253
+ };
254
+ }
255
+ }
256
+ }
257
+ return {
258
+ ...item,
259
+ schema,
260
+ nodes: this._searchInterface.nodes,
261
+ };
262
+ }
263
+ return item;
264
+ }
265
+ async _transformInputItem(item, existingItem, action, context, authorization) {
266
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
267
+ if (action !== 'create' && action !== 'update') {
268
+ return failure({
269
+ errorCode: 'action_not_supported',
270
+ errorMessage: `The action '${action}' is not supported for search records.`,
271
+ });
272
+ }
273
+ if (action === 'create') {
274
+ const isPublic = item.markers.includes(PUBLIC_READ_MARKER);
275
+ // Generate a unique collection name
276
+ // This is to ensure that users cannot choose their own collection names
277
+ // and potentially create insecurities in how collections are handled.
278
+ // e.g. a collection name with a "*" in it could potentially match all collections.
279
+ const collectionName = isPublic
280
+ ? `pub_.${uuid()}`
281
+ : `prv_.${uuid()}`;
282
+ const fields = [];
283
+ for (let key in item.schema) {
284
+ if (key === 'recordName' ||
285
+ key === 'address' ||
286
+ key === 'resourceKind') {
287
+ continue;
288
+ }
289
+ const field = item.schema[key];
290
+ if (field.drop) {
291
+ continue;
292
+ }
293
+ fields.push({
294
+ name: key,
295
+ type: field.type,
296
+ optional: (_a = field.optional) !== null && _a !== void 0 ? _a : undefined,
297
+ index: (_b = field.index) !== null && _b !== void 0 ? _b : undefined,
298
+ store: (_c = field.store) !== null && _c !== void 0 ? _c : undefined,
299
+ sort: (_d = field.sort) !== null && _d !== void 0 ? _d : undefined,
300
+ infix: (_e = field.infix) !== null && _e !== void 0 ? _e : undefined,
301
+ locale: (_f = field.locale) !== null && _f !== void 0 ? _f : undefined,
302
+ stem: (_g = field.stem) !== null && _g !== void 0 ? _g : undefined,
303
+ });
304
+ }
305
+ const collection = await this._searchInterface.createCollection({
306
+ name: collectionName,
307
+ fields,
308
+ });
309
+ const apiKey = await this._searchInterface.createApiKey({
310
+ description: `API Key for \`${collectionName}\``,
311
+ actions: ['documents:search'],
312
+ collections: [collectionName],
313
+ });
314
+ return success({
315
+ address: item.address,
316
+ markers: item.markers,
317
+ collectionName: collection.name,
318
+ searchApiKey: apiKey.value,
319
+ });
320
+ }
321
+ else if (action === 'update') {
322
+ // For updates, we need to update the existing collection's schema
323
+ if (!existingItem) {
324
+ return failure({
325
+ errorCode: 'record_not_found',
326
+ errorMessage: 'Cannot update a search record that does not exist.',
327
+ });
328
+ }
329
+ // Build the updated fields array
330
+ const fields = [];
331
+ for (let key in item.schema) {
332
+ const field = item.schema[key];
333
+ fields.push({
334
+ name: key,
335
+ type: field.type,
336
+ optional: (_h = field.optional) !== null && _h !== void 0 ? _h : undefined,
337
+ index: (_j = field.index) !== null && _j !== void 0 ? _j : undefined,
338
+ store: (_k = field.store) !== null && _k !== void 0 ? _k : undefined,
339
+ sort: (_l = field.sort) !== null && _l !== void 0 ? _l : undefined,
340
+ infix: (_m = field.infix) !== null && _m !== void 0 ? _m : undefined,
341
+ locale: (_o = field.locale) !== null && _o !== void 0 ? _o : undefined,
342
+ stem: (_p = field.stem) !== null && _p !== void 0 ? _p : undefined,
343
+ drop: (_q = field.drop) !== null && _q !== void 0 ? _q : undefined,
344
+ });
345
+ }
346
+ // Update the collection schema
347
+ const updateResult = await this._searchInterface.updateCollection({
348
+ name: existingItem.collectionName,
349
+ fields,
350
+ defaultSortingField: 'address',
351
+ });
352
+ if (!updateResult) {
353
+ return failure({
354
+ errorCode: 'server_error',
355
+ errorMessage: 'Failed to update the search collection schema.',
356
+ });
357
+ }
358
+ return success({
359
+ address: item.address,
360
+ markers: item.markers,
361
+ collectionName: existingItem.collectionName,
362
+ searchApiKey: existingItem.searchApiKey,
363
+ });
364
+ }
365
+ }
366
+ async _checkSubscriptionMetrics(action, context, authorization, item) {
367
+ const config = await this.config.getSubscriptionConfiguration();
368
+ const metrics = await this.store.getSubscriptionMetrics({
369
+ ownerId: context.recordOwnerId,
370
+ studioId: context.recordStudioId,
371
+ });
372
+ const features = getSearchFeatures(config, metrics.subscriptionStatus, metrics.subscriptionId, metrics.subscriptionType, metrics.currentPeriodStartMs, metrics.currentPeriodEndMs);
373
+ if (!features.allowed) {
374
+ return {
375
+ success: false,
376
+ errorCode: 'not_authorized',
377
+ errorMessage: 'Search records are not allowed for this subscription.',
378
+ };
379
+ }
380
+ if (action === 'create' && typeof features.maxItems === 'number') {
381
+ if (metrics.totalItems >= features.maxItems) {
382
+ return {
383
+ success: false,
384
+ errorCode: 'subscription_limit_reached',
385
+ errorMessage: 'The maximum number of search record items has been reached for your subscription.',
386
+ };
387
+ }
388
+ }
389
+ return {
390
+ success: true,
391
+ config,
392
+ metrics,
393
+ features,
394
+ };
395
+ }
396
+ }
397
+ __decorate([
398
+ traced(TRACE_NAME)
399
+ ], SearchRecordsController.prototype, "storeDocument", null);
400
+ __decorate([
401
+ traced(TRACE_NAME)
402
+ ], SearchRecordsController.prototype, "eraseDocument", null);
403
+ __decorate([
404
+ traced(TRACE_NAME)
405
+ ], SearchRecordsController.prototype, "sync", null);
406
+ __decorate([
407
+ traced(TRACE_NAME)
408
+ ], SearchRecordsController.prototype, "unsync", null);
409
+ __decorate([
410
+ traced(TRACE_NAME)
411
+ ], SearchRecordsController.prototype, "search", null);
412
+ export const SEARCH_COLLECTION_FIELD = z.object({
413
+ type: z.enum([
414
+ 'string',
415
+ 'string[]',
416
+ 'int32',
417
+ 'int32[]',
418
+ 'int64',
419
+ 'int64[]',
420
+ 'float',
421
+ 'float[]',
422
+ 'bool',
423
+ 'bool[]',
424
+ 'geopoint',
425
+ 'geopoint[]',
426
+ 'geopolygon',
427
+ 'object',
428
+ 'object[]',
429
+ 'string*',
430
+ 'image',
431
+ 'auto',
432
+ ]),
433
+ // facet: z.boolean()
434
+ // .describe('Enables faceting on the field. Defaults to `false`.')
435
+ // .optional()
436
+ // .nullable(),
437
+ optional: z
438
+ .boolean()
439
+ .describe('When set to `true`, the field can have empty, null or missing values. Default: `false`.')
440
+ .optional()
441
+ .nullable(),
442
+ index: z
443
+ .boolean()
444
+ .describe('When set to `false`, the field will not be indexed in any in-memory index (e.g. search/sort/filter/facet). Default: `true`.')
445
+ .optional()
446
+ .nullable(),
447
+ store: z
448
+ .boolean()
449
+ .describe('When set to `false`, the field value will not be stored on disk. Default: `true`.')
450
+ .optional()
451
+ .nullable(),
452
+ sort: z
453
+ .boolean()
454
+ .describe('When set to true, the field will be sortable. Default: `true` for numbers, `false` otherwise.')
455
+ .optional()
456
+ .nullable(),
457
+ infix: z
458
+ .boolean()
459
+ .describe('When set to `true`, the field value can be infix-searched. Incurs significant memory overhead. Default: `false`.')
460
+ .optional()
461
+ .nullable(),
462
+ locale: z
463
+ .string()
464
+ .describe('For configuring language specific tokenization, e.g. `jp` for Japanese. Default: `en` which also broadly supports most European languages.')
465
+ .max(10)
466
+ .optional()
467
+ .nullable(),
468
+ stem: z
469
+ .boolean()
470
+ .describe('When set to `true`, the field value will be stemmed. Default: `false`.')
471
+ .optional()
472
+ .nullable(),
473
+ drop: z
474
+ .boolean()
475
+ .describe('When set to `true`, the field will be dropped from the collection if it is not present in the input. Default: `false`.')
476
+ .optional()
477
+ .nullable(),
478
+ });
479
+ export const SEARCH_COLLECTION_SCHEMA = z
480
+ .object({})
481
+ .catchall(SEARCH_COLLECTION_FIELD)
482
+ .refine((val) => Object.keys(val).length < 100, {
483
+ message: 'Search collections cannot have more than 100 fields.',
484
+ })
485
+ .refine((val) => Object.keys(val).length >= 1, {
486
+ message: 'Search collections must have at least 1 field.',
487
+ });
488
+ export const SEARCH_DOCUMENT_SCHEMA = z
489
+ .object({
490
+ recordName: RECORD_NAME_VALIDATION.optional().nullable(),
491
+ address: ADDRESS_VALIDATION.optional().nullable(),
492
+ resourceKind: RESOURCE_KIND_VALIDATION.optional().nullable(),
493
+ })
494
+ .catchall(z.union([
495
+ // Limit top level strings to 10 * 1024 characters (10KB)
496
+ z.string().max(10 * 1024),
497
+ z.number(),
498
+ z.boolean(),
499
+ // Limit arrays to 100 items, with each item being a string of max 1024 characters (1KB)
500
+ z
501
+ .array(z.string().max(1024) // (1KB)
502
+ )
503
+ .max(100),
504
+ z.array(z.number()),
505
+ z.array(z.boolean()),
506
+ z
507
+ .object({})
508
+ .catchall(z.union([
509
+ // Limit strings in nested objects to 1024 characters (1KB)
510
+ z.string().max(1024),
511
+ z.number(),
512
+ z.boolean(),
513
+ ]))
514
+ .refine((val) => Object.keys(val).length < 15, {
515
+ message: 'Nested objects cannot have more than 15 keys.',
516
+ }),
517
+ ]))
518
+ .refine((val) => Object.keys(val).length < 100, {
519
+ message: 'Search documents cannot have more than 100 keys.',
520
+ });
521
+ //# sourceMappingURL=SearchRecordsController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchRecordsController.js","sourceRoot":"","sources":["SearchRecordsController.ts"],"names":[],"mappings":"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"}