@flowerforce/flowerbase 1.7.5-beta.2 → 1.7.5-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/features/functions/controller.d.ts +2 -0
  2. package/dist/features/functions/controller.d.ts.map +1 -1
  3. package/dist/features/functions/controller.js +244 -19
  4. package/dist/services/api/index.d.ts +4 -0
  5. package/dist/services/api/index.d.ts.map +1 -1
  6. package/dist/services/api/utils.d.ts +1 -0
  7. package/dist/services/api/utils.d.ts.map +1 -1
  8. package/dist/services/index.d.ts +4 -0
  9. package/dist/services/index.d.ts.map +1 -1
  10. package/dist/services/mongodb-atlas/utils.d.ts.map +1 -1
  11. package/dist/services/mongodb-atlas/utils.js +17 -1
  12. package/dist/utils/context/helpers.d.ts +12 -0
  13. package/dist/utils/context/helpers.d.ts.map +1 -1
  14. package/dist/utils/roles/helpers.d.ts.map +1 -1
  15. package/dist/utils/roles/helpers.js +19 -4
  16. package/dist/utils/roles/interface.d.ts +10 -6
  17. package/dist/utils/roles/interface.d.ts.map +1 -1
  18. package/dist/utils/roles/machines/commonValidators.js +2 -2
  19. package/dist/utils/roles/machines/fieldPermissions.d.ts +8 -0
  20. package/dist/utils/roles/machines/fieldPermissions.d.ts.map +1 -0
  21. package/dist/utils/roles/machines/fieldPermissions.js +67 -0
  22. package/dist/utils/roles/machines/read/A/index.d.ts.map +1 -1
  23. package/dist/utils/roles/machines/read/A/index.js +4 -3
  24. package/dist/utils/roles/machines/read/C/index.d.ts.map +1 -1
  25. package/dist/utils/roles/machines/read/C/index.js +16 -16
  26. package/dist/utils/roles/machines/read/C/validators.js +2 -2
  27. package/dist/utils/roles/machines/read/D/index.js +1 -1
  28. package/dist/utils/roles/machines/read/D/validators.d.ts +1 -1
  29. package/dist/utils/roles/machines/read/D/validators.d.ts.map +1 -1
  30. package/dist/utils/roles/machines/read/D/validators.js +19 -21
  31. package/dist/utils/roles/machines/write/B/index.d.ts.map +1 -1
  32. package/dist/utils/roles/machines/write/B/index.js +12 -9
  33. package/dist/utils/roles/machines/write/C/index.js +1 -1
  34. package/dist/utils/roles/machines/write/C/validators.d.ts +1 -1
  35. package/dist/utils/roles/machines/write/C/validators.d.ts.map +1 -1
  36. package/dist/utils/roles/machines/write/C/validators.js +16 -21
  37. package/package.json +1 -1
  38. package/src/features/functions/__tests__/watch-filter.test.ts +116 -0
  39. package/src/features/functions/controller.ts +282 -22
  40. package/src/features/triggers/__tests__/index.test.ts +2 -2
  41. package/src/services/mongodb-atlas/__tests__/findOneAndUpdate.test.ts +1 -1
  42. package/src/services/mongodb-atlas/utils.ts +19 -4
  43. package/src/utils/__tests__/STEP_A_STATES.test.ts +24 -2
  44. package/src/utils/__tests__/STEP_C_STATES.test.ts +61 -27
  45. package/src/utils/__tests__/STEP_D_STATES.test.ts +9 -9
  46. package/src/utils/__tests__/WRITE_STEP_B_STATES.test.ts +184 -0
  47. package/src/utils/__tests__/checkAdditionalFieldsFn.test.ts +2 -2
  48. package/src/utils/__tests__/checkFieldsPropertyExists.test.ts +13 -0
  49. package/src/utils/__tests__/checkIsValidFieldNameFn.test.ts +52 -121
  50. package/src/utils/__tests__/evaluateTopLevelReadFn.test.ts +10 -1
  51. package/src/utils/__tests__/evaluateTopLevelWriteFn.test.ts +21 -5
  52. package/src/utils/roles/helpers.ts +18 -4
  53. package/src/utils/roles/interface.ts +13 -6
  54. package/src/utils/roles/machines/commonValidators.ts +1 -1
  55. package/src/utils/roles/machines/fieldPermissions.ts +86 -0
  56. package/src/utils/roles/machines/read/A/index.ts +4 -3
  57. package/src/utils/roles/machines/read/C/index.ts +18 -18
  58. package/src/utils/roles/machines/read/C/validators.ts +2 -2
  59. package/src/utils/roles/machines/read/D/index.ts +1 -1
  60. package/src/utils/roles/machines/read/D/validators.ts +12 -25
  61. package/src/utils/roles/machines/write/B/index.ts +12 -9
  62. package/src/utils/roles/machines/write/C/index.ts +1 -1
  63. package/src/utils/roles/machines/write/C/validators.ts +9 -26
@@ -1,4 +1,6 @@
1
1
  import { FunctionController } from './interface';
2
+ export declare const mapWatchFilterToChangeStreamMatch: (value: unknown) => unknown;
3
+ export declare const mapWatchFilterToDocumentQuery: (value: unknown) => unknown;
2
4
  /**
3
5
  * > Creates a pre handler for every query
4
6
  * @param app -> the fastify instance
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/features/functions/controller.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAoFhD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,kBAqPjC,CAAA"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/features/functions/controller.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAmHhD,eAAO,MAAM,iCAAiC,GAAI,OAAO,OAAO,KAAG,OA0BlE,CAAA;AAID,eAAO,MAAM,6BAA6B,GAAI,OAAO,OAAO,KAAG,OAgD9D,CAAA;AAqHD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,kBAuRjC,CAAA"}
@@ -20,7 +20,7 @@ var __rest = (this && this.__rest) || function (s, e) {
20
20
  return t;
21
21
  };
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.functionsController = void 0;
23
+ exports.functionsController = exports.mapWatchFilterToDocumentQuery = exports.mapWatchFilterToChangeStreamMatch = void 0;
24
24
  const bson_1 = require("bson");
25
25
  const services_1 = require("../../services");
26
26
  const context_1 = require("../../utils/context");
@@ -58,14 +58,205 @@ const isReturnedError = (value) => {
58
58
  };
59
59
  const serializeEjson = (value) => JSON.stringify(bson_1.EJSON.serialize(value, { relaxed: false }));
60
60
  const isRecord = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
61
+ const isPlainRecord = (value) => {
62
+ if (!isRecord(value))
63
+ return false;
64
+ const prototype = Object.getPrototypeOf(value);
65
+ return prototype === Object.prototype || prototype === null;
66
+ };
67
+ const isCursorLike = (value) => {
68
+ if (!value || typeof value !== 'object')
69
+ return false;
70
+ return typeof value.toArray === 'function';
71
+ };
72
+ const normalizeFunctionResult = (value) => __awaiter(void 0, void 0, void 0, function* () {
73
+ if (!isCursorLike(value))
74
+ return value;
75
+ return yield value.toArray();
76
+ });
61
77
  const sharedWatchStreams = new Map();
62
78
  let watchSubscriberCounter = 0;
79
+ const maxSharedWatchStreams = Number(process.env.MAX_SHARED_WATCH_STREAMS || 200);
80
+ const debugWatchStreams = process.env.DEBUG_FUNCTIONS === 'true';
81
+ const changeEventRootKeys = new Set([
82
+ '_id',
83
+ 'operationType',
84
+ 'clusterTime',
85
+ 'txnNumber',
86
+ 'lsid',
87
+ 'ns',
88
+ 'documentKey',
89
+ 'fullDocument',
90
+ 'updateDescription'
91
+ ]);
92
+ const isChangeEventPath = (key) => {
93
+ if (changeEventRootKeys.has(key))
94
+ return true;
95
+ return (key.startsWith('ns.') ||
96
+ key.startsWith('documentKey.') ||
97
+ key.startsWith('fullDocument.') ||
98
+ key.startsWith('updateDescription.'));
99
+ };
100
+ const isOpaqueChangeEventObjectKey = (key) => key === 'ns' || key === 'documentKey' || key === 'fullDocument' || key === 'updateDescription';
101
+ const mapWatchFilterToChangeStreamMatch = (value) => {
102
+ if (Array.isArray(value)) {
103
+ return value.map((item) => (0, exports.mapWatchFilterToChangeStreamMatch)(item));
104
+ }
105
+ if (!isPlainRecord(value))
106
+ return value;
107
+ return Object.entries(value).reduce((acc, [key, current]) => {
108
+ if (key.startsWith('$')) {
109
+ acc[key] = (0, exports.mapWatchFilterToChangeStreamMatch)(current);
110
+ return acc;
111
+ }
112
+ if (isOpaqueChangeEventObjectKey(key)) {
113
+ acc[key] = current;
114
+ return acc;
115
+ }
116
+ if (isChangeEventPath(key)) {
117
+ acc[key] = (0, exports.mapWatchFilterToChangeStreamMatch)(current);
118
+ return acc;
119
+ }
120
+ acc[`fullDocument.${key}`] = (0, exports.mapWatchFilterToChangeStreamMatch)(current);
121
+ return acc;
122
+ }, {});
123
+ };
124
+ exports.mapWatchFilterToChangeStreamMatch = mapWatchFilterToChangeStreamMatch;
125
+ const isLogicalOperator = (key) => key === '$and' || key === '$or' || key === '$nor';
126
+ const mapWatchFilterToDocumentQuery = (value) => {
127
+ if (Array.isArray(value)) {
128
+ const mapped = value
129
+ .map((item) => (0, exports.mapWatchFilterToDocumentQuery)(item))
130
+ .filter((item) => !(isRecord(item) && Object.keys(item).length === 0));
131
+ return mapped;
132
+ }
133
+ if (!isPlainRecord(value))
134
+ return value;
135
+ return Object.entries(value).reduce((acc, [key, current]) => {
136
+ if (key.startsWith('$')) {
137
+ const mapped = (0, exports.mapWatchFilterToDocumentQuery)(current);
138
+ if (isLogicalOperator(key) && Array.isArray(mapped)) {
139
+ if (mapped.length > 0) {
140
+ acc[key] = mapped;
141
+ }
142
+ return acc;
143
+ }
144
+ if (typeof mapped !== 'undefined') {
145
+ acc[key] = mapped;
146
+ }
147
+ return acc;
148
+ }
149
+ if (key === 'fullDocument') {
150
+ if (!isPlainRecord(current))
151
+ return acc;
152
+ const mapped = (0, exports.mapWatchFilterToDocumentQuery)(current);
153
+ if (isRecord(mapped)) {
154
+ Object.assign(acc, mapped);
155
+ }
156
+ return acc;
157
+ }
158
+ if (key.startsWith('fullDocument.')) {
159
+ const docKey = key.slice('fullDocument.'.length);
160
+ if (!docKey)
161
+ return acc;
162
+ acc[docKey] = (0, exports.mapWatchFilterToDocumentQuery)(current);
163
+ return acc;
164
+ }
165
+ if (isChangeEventPath(key)) {
166
+ return acc;
167
+ }
168
+ acc[key] = (0, exports.mapWatchFilterToDocumentQuery)(current);
169
+ return acc;
170
+ }, {});
171
+ };
172
+ exports.mapWatchFilterToDocumentQuery = mapWatchFilterToDocumentQuery;
173
+ const toStableValue = (value) => {
174
+ if (Array.isArray(value)) {
175
+ return value.map((item) => toStableValue(item));
176
+ }
177
+ if (!isPlainRecord(value))
178
+ return value;
179
+ const sortedEntries = Object.entries(value).sort(([left], [right]) => left.localeCompare(right));
180
+ return sortedEntries.reduce((acc, [key, current]) => {
181
+ acc[key] = toStableValue(current);
182
+ return acc;
183
+ }, {});
184
+ };
185
+ const stableSerialize = (value) => {
186
+ const serialized = bson_1.EJSON.serialize(value, { relaxed: false });
187
+ return JSON.stringify(toStableValue(serialized));
188
+ };
189
+ const getWatchPermissionContext = (user) => ({
190
+ role: user.role,
191
+ roles: user.roles,
192
+ data: user.data,
193
+ custom_data: user.custom_data,
194
+ user_data: user.user_data
195
+ });
196
+ const resolveWatchStream = (database, collection, watchArgs, user) => {
197
+ const keys = Object.keys(watchArgs);
198
+ const hasOnlyAllowedKeys = keys.every((key) => key === 'filter' || key === 'ids');
199
+ if (!hasOnlyAllowedKeys) {
200
+ throw new Error('watch options support only "filter" or "ids"');
201
+ }
202
+ const extraFilter = parseWatchFilter(watchArgs);
203
+ const ids = watchArgs.ids;
204
+ if (extraFilter && typeof ids !== 'undefined') {
205
+ throw new Error('watch options cannot include both "ids" and "filter"');
206
+ }
207
+ const pipeline = [];
208
+ if (extraFilter) {
209
+ pipeline.push({ $match: (0, exports.mapWatchFilterToChangeStreamMatch)(extraFilter) });
210
+ }
211
+ if (typeof ids !== 'undefined') {
212
+ if (!Array.isArray(ids)) {
213
+ throw new Error('watch ids must be an array');
214
+ }
215
+ pipeline.push({
216
+ $match: {
217
+ $or: [
218
+ { 'documentKey._id': { $in: ids } },
219
+ { 'fullDocument._id': { $in: ids } }
220
+ ]
221
+ }
222
+ });
223
+ }
224
+ const options = { fullDocument: 'updateLookup' };
225
+ const streamKey = stableSerialize({
226
+ database,
227
+ collection,
228
+ pipeline,
229
+ options,
230
+ permissionContext: getWatchPermissionContext(user)
231
+ });
232
+ return { extraFilter, options, pipeline, streamKey };
233
+ };
234
+ const getWatchStats = () => {
235
+ let subscribers = 0;
236
+ for (const hub of sharedWatchStreams.values()) {
237
+ subscribers += hub.subscribers.size;
238
+ }
239
+ return {
240
+ hubs: sharedWatchStreams.size,
241
+ subscribers
242
+ };
243
+ };
244
+ const logWatchStats = (event, details) => {
245
+ if (!debugWatchStreams)
246
+ return;
247
+ const stats = getWatchStats();
248
+ console.log('[watch-pool]', event, Object.assign({ hubs: stats.hubs, subscribers: stats.subscribers }, details));
249
+ };
63
250
  const parseWatchFilter = (args) => {
64
- var _a;
65
251
  if (!isRecord(args))
66
252
  return undefined;
67
- const candidate = (_a = (isRecord(args.filter) ? args.filter : undefined)) !== null && _a !== void 0 ? _a : (isRecord(args.query) ? args.query : undefined);
68
- return candidate ? candidate : undefined;
253
+ const candidate = isRecord(args.filter) ? args.filter : undefined;
254
+ if (!candidate)
255
+ return undefined;
256
+ if ('$match' in candidate) {
257
+ throw new Error('watch filter must be a query object, not a $match stage');
258
+ }
259
+ return candidate;
69
260
  };
70
261
  const isReadableDocumentResult = (value) => !!value &&
71
262
  typeof value === 'object' &&
@@ -136,12 +327,13 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
136
327
  functionsList,
137
328
  services: services_1.services
138
329
  });
139
- if (isReturnedError(result)) {
330
+ const normalizedResult = yield normalizeFunctionResult(result);
331
+ if (isReturnedError(normalizedResult)) {
140
332
  res.type('application/json');
141
- return JSON.stringify({ message: result.message, name: result.name });
333
+ return JSON.stringify({ message: normalizedResult.message, name: normalizedResult.name });
142
334
  }
143
335
  res.type('application/json');
144
- return serializeEjson(result);
336
+ return serializeEjson(normalizedResult);
145
337
  }
146
338
  catch (error) {
147
339
  res.status(400);
@@ -165,7 +357,9 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
165
357
  const { baas_request, stitch_request } = query;
166
358
  const decodedConfig = JSON.parse(Buffer.from(baas_request || stitch_request || '', 'base64').toString('utf8'));
167
359
  const config = bson_1.EJSON.deserialize(decodedConfig);
168
- const [_a] = config.arguments, { database, collection } = _a, watchArgs = __rest(_a, ["database", "collection"]);
360
+ const [_a] = config.arguments, { database, collection } = _a, watchArgsInput = __rest(_a, ["database", "collection"]);
361
+ const watchArgs = isRecord(watchArgsInput) ? watchArgsInput : {};
362
+ console.log("🚀 ~ functionsController ~ watchArgs:", watchArgs);
169
363
  const headers = {
170
364
  'Content-Type': 'text/event-stream',
171
365
  'Cache-Control': 'no-cache',
@@ -174,17 +368,27 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
174
368
  "access-control-allow-origin": '*',
175
369
  "access-control-allow-headers": "X-Stitch-Location, X-Baas-Location, Location",
176
370
  };
177
- res.raw.writeHead(200, headers);
178
- res.raw.flushHeaders();
179
- const streamKey = `${database}::${collection}`;
180
371
  const subscriberId = `${Date.now()}-${watchSubscriberCounter++}`;
181
- const extraFilter = parseWatchFilter(watchArgs);
182
- const mongoClient = app.mongo.client;
372
+ const { streamKey, extraFilter, options: watchOptions, pipeline: watchPipeline } = resolveWatchStream(database, collection, watchArgs, user);
183
373
  let hub = sharedWatchStreams.get(streamKey);
184
374
  if (!hub) {
185
- const stream = mongoClient.db(database).collection(collection).watch([], {
186
- fullDocument: 'whenAvailable'
187
- });
375
+ if (sharedWatchStreams.size >= maxSharedWatchStreams) {
376
+ res.status(503);
377
+ return JSON.stringify({
378
+ error: JSON.stringify({
379
+ message: 'Watch stream limit reached',
380
+ name: 'WatchStreamLimitError'
381
+ }),
382
+ error_code: 'WatchStreamLimitError'
383
+ });
384
+ }
385
+ const stream = services_1.services['mongodb-atlas'](app, {
386
+ user,
387
+ rules
388
+ })
389
+ .db(database)
390
+ .collection(collection)
391
+ .watch(watchPipeline, watchOptions);
188
392
  hub = {
189
393
  database,
190
394
  collection,
@@ -192,7 +396,13 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
192
396
  subscribers: new Map()
193
397
  };
194
398
  sharedWatchStreams.set(streamKey, hub);
399
+ logWatchStats('hub-created', { streamKey, database, collection });
400
+ }
401
+ else {
402
+ logWatchStats('hub-reused', { streamKey, database, collection });
195
403
  }
404
+ res.raw.writeHead(200, headers);
405
+ res.raw.flushHeaders();
196
406
  const ensureHubListeners = (currentHub) => {
197
407
  if (currentHub.listenersBound) {
198
408
  return;
@@ -201,6 +411,7 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
201
411
  currentHub.stream.off('change', onHubChange);
202
412
  currentHub.stream.off('error', onHubError);
203
413
  sharedWatchStreams.delete(streamKey);
414
+ logWatchStats('hub-closed', { streamKey, database, collection });
204
415
  try {
205
416
  yield currentHub.stream.close();
206
417
  }
@@ -209,19 +420,21 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
209
420
  }
210
421
  });
211
422
  const onHubChange = (change) => __awaiter(void 0, void 0, void 0, function* () {
423
+ console.log("🚀 ~ onHubChange ~ change:", change);
212
424
  const subscribers = Array.from(currentHub.subscribers.values());
213
425
  yield Promise.all(subscribers.map((subscriber) => __awaiter(void 0, void 0, void 0, function* () {
214
426
  var _a, _b, _c;
215
427
  const subscriberRes = subscriber.response;
216
428
  if (subscriberRes.writableEnded || subscriberRes.destroyed) {
217
429
  currentHub.subscribers.delete(subscriber.id);
430
+ logWatchStats('subscriber-auto-removed', { streamKey, subscriberId: subscriber.id });
218
431
  return;
219
432
  }
220
433
  const docId = (_b = (_a = change === null || change === void 0 ? void 0 : change.documentKey) === null || _a === void 0 ? void 0 : _a._id) !== null && _b !== void 0 ? _b : (_c = change === null || change === void 0 ? void 0 : change.fullDocument) === null || _c === void 0 ? void 0 : _c._id;
221
434
  if (typeof docId === 'undefined')
222
435
  return;
223
- const readQuery = subscriber.extraFilter
224
- ? { $and: [subscriber.extraFilter, { _id: docId }] }
436
+ const readQuery = subscriber.documentFilter
437
+ ? { $and: [subscriber.documentFilter, { _id: docId }] }
225
438
  : { _id: docId };
226
439
  try {
227
440
  const readableDoc = yield services_1.services['mongodb-atlas'](app, {
@@ -231,6 +444,7 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
231
444
  .db(currentHub.database)
232
445
  .collection(currentHub.collection)
233
446
  .findOne(readQuery);
447
+ console.log("🚀 ~ onHubChange ~ readableDoc:", readableDoc);
234
448
  if (!isReadableDocumentResult(readableDoc))
235
449
  return;
236
450
  subscriberRes.write(`data: ${serializeEjson(change)}\n\n`);
@@ -239,6 +453,7 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
239
453
  subscriberRes.write(`event: error\ndata: ${formatFunctionExecutionError(error)}\n\n`);
240
454
  subscriberRes.end();
241
455
  currentHub.subscribers.delete(subscriber.id);
456
+ logWatchStats('subscriber-error-removed', { streamKey, subscriberId: subscriber.id });
242
457
  }
243
458
  })));
244
459
  if (!currentHub.subscribers.size) {
@@ -265,17 +480,27 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
265
480
  id: subscriberId,
266
481
  user,
267
482
  response: res.raw,
268
- extraFilter
483
+ documentFilter: (() => {
484
+ if (!extraFilter)
485
+ return undefined;
486
+ const mapped = (0, exports.mapWatchFilterToDocumentQuery)(extraFilter);
487
+ if (!isRecord(mapped) || Object.keys(mapped).length === 0)
488
+ return undefined;
489
+ return mapped;
490
+ })()
269
491
  };
270
492
  hub.subscribers.set(subscriberId, subscriber);
493
+ logWatchStats('subscriber-added', { streamKey, subscriberId });
271
494
  req.raw.on('close', () => {
272
495
  const currentHub = sharedWatchStreams.get(streamKey);
273
496
  if (!currentHub)
274
497
  return;
275
498
  currentHub.subscribers.delete(subscriberId);
499
+ logWatchStats('subscriber-closed', { streamKey, subscriberId });
276
500
  if (!currentHub.subscribers.size) {
277
501
  void currentHub.stream.close();
278
502
  sharedWatchStreams.delete(streamKey);
503
+ logWatchStats('hub-empty-closed', { streamKey });
279
504
  }
280
505
  });
281
506
  }));
@@ -30,6 +30,7 @@ declare const Api: (_app?: unknown, opt?: {
30
30
  bytes: () => Uint8Array<ArrayBuffer>;
31
31
  };
32
32
  statusCode: number;
33
+ statusText: string;
33
34
  headers: import("undici/types/header").IncomingHttpHeaders;
34
35
  trailers: Record<string, string>;
35
36
  opaque: T;
@@ -58,6 +59,7 @@ declare const Api: (_app?: unknown, opt?: {
58
59
  bytes: () => Uint8Array<ArrayBuffer>;
59
60
  };
60
61
  statusCode: number;
62
+ statusText: string;
61
63
  headers: import("undici/types/header").IncomingHttpHeaders;
62
64
  trailers: Record<string, string>;
63
65
  opaque: T;
@@ -86,6 +88,7 @@ declare const Api: (_app?: unknown, opt?: {
86
88
  bytes: () => Uint8Array<ArrayBuffer>;
87
89
  };
88
90
  statusCode: number;
91
+ statusText: string;
89
92
  headers: import("undici/types/header").IncomingHttpHeaders;
90
93
  trailers: Record<string, string>;
91
94
  opaque: T;
@@ -114,6 +117,7 @@ declare const Api: (_app?: unknown, opt?: {
114
117
  bytes: () => Uint8Array<ArrayBuffer>;
115
118
  };
116
119
  statusCode: number;
120
+ statusText: string;
117
121
  headers: import("undici/types/header").IncomingHttpHeaders;
118
122
  trailers: Record<string, string>;
119
123
  opaque: T;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/api/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAGxE;;GAEG;AACH,QAAA,MAAM,GAAG,GAAI,OAAO,OAAO,EAAE,MAAM;IAAE,UAAU,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE;UAG5D,CAAC,wCAAoD,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAuB7D,CAAC,gGASX,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA+BD,CAAC,gGASV,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA+BG,CAAC,wEAOb,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyBlB,CAAA;AAED,eAAe,GAAG,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/api/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAGxE;;GAEG;AACH,QAAA,MAAM,GAAG,GAAI,OAAO,OAAO,EAAE,MAAM;IAAE,UAAU,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE;UAG5D,CAAC,wCAAoD,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAuB7D,CAAC,gGASX,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA+BD,CAAC,gGASV,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA+BG,CAAC,wEAOb,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyBlB,CAAA;AAED,eAAe,GAAG,CAAA"}
@@ -29,6 +29,7 @@ export declare const makeRequest: <T = null>({ method, url, headers, body, resol
29
29
  bytes: () => Uint8Array<ArrayBuffer>;
30
30
  };
31
31
  statusCode: number;
32
+ statusText: string;
32
33
  headers: import("undici/types/header").IncomingHttpHeaders;
33
34
  trailers: Record<string, string>;
34
35
  opaque: T;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/services/api/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAS,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAgBlD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAU,CAAC,GAAG,IAAI,EAAE,6CAMzC,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBnB,CAAA"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/services/api/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAS,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAgBlD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAU,CAAC,GAAG,IAAI,EAAE,6CAMzC,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBnB,CAAA"}
@@ -27,6 +27,7 @@ export declare const services: {
27
27
  bytes: () => Uint8Array<ArrayBuffer>;
28
28
  };
29
29
  statusCode: number;
30
+ statusText: string;
30
31
  headers: import("undici/types/header").IncomingHttpHeaders;
31
32
  trailers: Record<string, string>;
32
33
  opaque: T;
@@ -55,6 +56,7 @@ export declare const services: {
55
56
  bytes: () => Uint8Array<ArrayBuffer>;
56
57
  };
57
58
  statusCode: number;
59
+ statusText: string;
58
60
  headers: import("undici/types/header").IncomingHttpHeaders;
59
61
  trailers: Record<string, string>;
60
62
  opaque: T;
@@ -83,6 +85,7 @@ export declare const services: {
83
85
  bytes: () => Uint8Array<ArrayBuffer>;
84
86
  };
85
87
  statusCode: number;
88
+ statusText: string;
86
89
  headers: import("undici/types/header").IncomingHttpHeaders;
87
90
  trailers: Record<string, string>;
88
91
  opaque: T;
@@ -111,6 +114,7 @@ export declare const services: {
111
114
  bytes: () => Uint8Array<ArrayBuffer>;
112
115
  };
113
116
  statusCode: number;
117
+ statusText: string;
114
118
  headers: import("undici/types/header").IncomingHttpHeaders;
115
119
  trailers: Record<string, string>;
116
120
  opaque: T;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ;;kBAMoG,CAAC;uBAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAA2hB,CAAC;uBAAe,CAAC;;;;;;;;;;;;;;;;sBAA0/F,CAAC;yBAAa,CAAC;;;;;;;;;;;CAD9rH,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ;;kBAMoG,CAAC;uBAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAA2hB,CAAC;uBAAe,CAAC;;;;;;;;;;;;;;;;sBAA0/F,CAAC;yBAAa,CAAC;;;;;;;;;;;CAD9rH,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,SAAS,CAAA;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,EACL,mBAAmB,EAEnB,MAAM,EAEN,UAAU,EACV,KAAK,EAGN,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAGlD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAE7D,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,IAAI,GAAG,MAAM,EAAE,2BAInD,kBAAkB,CAAC,CAAC,CAAC,QA8BvB,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,UAAS,MAAM,EAAO,EACtB,QAAQ,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EACtD,OAAO,IAAI,8BAcZ,CAAA;AAED,eAAO,MAAM,sBAAsB,GACjC,UAAS,MAAM,EAAO,EACtB,OAAO,IAAI,KACV,UAAU,GAAG,IAaf,CAAA;AAED,eAAO,MAAM,4BAA4B,GACvC,UAAU,mBAAmB,EAC7B,OAAO,MAAM,CACX,MAAM,EACN;IACE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;CACf,CACF,EACD,MAAM,IAAI,EACV,gBAAgB,MAAM,EACtB,UAAU;IACR,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,KACA,mBA6GF,CAAA;AAED,eAAO,MAAM,kBAAkB,GAC7B,OAAO,KAAK,EACZ,gBAAgB,MAAM,EACtB,WAAW,eAAe,SAM3B,CAAA;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE;;;;;;;;iBA2HuvrS,CAAC;sBAAgC,CAAC;2BAAsC,CAAC;;;;IAnH93rS;AAED,eAAO,MAAM,0BAA0B,GAAI,UAAU,QAAQ,EAAE,aAgC9D,CAAA;AAYD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,mBAAmB,QA+BvE;AAED,wBAAgB,8BAA8B,CAAC,WAAW,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;CAAE,YAK9E;AAyBD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,EAAE,uBAKtF"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,SAAS,CAAA;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,EACL,mBAAmB,EAEnB,MAAM,EAEN,UAAU,EACV,KAAK,EAGN,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAGlD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAE7D,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,IAAI,GAAG,MAAM,EAAE,2BAInD,kBAAkB,CAAC,CAAC,CAAC,QA8BvB,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,UAAS,MAAM,EAAO,EACtB,QAAQ,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EACtD,OAAO,IAAI,8BAcZ,CAAA;AAED,eAAO,MAAM,sBAAsB,GACjC,UAAS,MAAM,EAAO,EACtB,OAAO,IAAI,KACV,UAAU,GAAG,IAaf,CAAA;AAED,eAAO,MAAM,4BAA4B,GACvC,UAAU,mBAAmB,EAC7B,OAAO,MAAM,CACX,MAAM,EACN;IACE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;CACf,CACF,EACD,MAAM,IAAI,EACV,gBAAgB,MAAM,EACtB,UAAU;IACR,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,KACA,mBA6GF,CAAA;AAED,eAAO,MAAM,kBAAkB,GAC7B,OAAO,KAAK,EACZ,gBAAgB,MAAM,EACtB,WAAW,eAAe,SAM3B,CAAA;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE;;;;;;;;iBA0I8iqS,CAAC;sBAAgC,CAAC;2BAAsC,CAAC;;;;IAlIrrqS;AAED,eAAO,MAAM,0BAA0B,GAAI,UAAU,QAAQ,EAAE,aAgC9D,CAAA;AAYD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,mBAAmB,QA+BvE;AAED,wBAAgB,8BAA8B,CAAC,WAAW,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;CAAE,YAK9E;AAwCD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,EAAE,uBAKtF"}
@@ -217,6 +217,7 @@ function getHiddenFieldsFromRulesConfig(rulesConfig) {
217
217
  }
218
218
  function collectHiddenFieldsFromRoles(roles = []) {
219
219
  const hiddenFields = new Set();
220
+ const isFieldPermissionObject = (value) => !!value && typeof value === 'object' && ('read' in value || 'write' in value);
220
221
  const collectFromFields = (fields) => {
221
222
  if (!fields)
222
223
  return;
@@ -227,9 +228,24 @@ function collectHiddenFieldsFromRoles(roles = []) {
227
228
  }
228
229
  });
229
230
  };
231
+ const collectFromAdditionalFields = (fields) => {
232
+ if (!fields || typeof fields !== 'object')
233
+ return;
234
+ // Global additional_fields permissions (read/write) apply to unknown fields and cannot be mapped.
235
+ if (isFieldPermissionObject(fields))
236
+ return;
237
+ Object.entries(fields).forEach(([fieldName, permissions]) => {
238
+ if (!isFieldPermissionObject(permissions))
239
+ return;
240
+ const canRead = Boolean(permissions.read || permissions.write);
241
+ if (!canRead) {
242
+ hiddenFields.add(fieldName);
243
+ }
244
+ });
245
+ };
230
246
  roles.forEach((role) => {
231
247
  collectFromFields(role.fields);
232
- collectFromFields(role.additional_fields);
248
+ collectFromAdditionalFields(role.additional_fields);
233
249
  });
234
250
  return Array.from(hiddenFields);
235
251
  }
@@ -82,6 +82,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
82
82
  bytes: () => Uint8Array<ArrayBuffer>;
83
83
  };
84
84
  statusCode: number;
85
+ statusText: string;
85
86
  headers: import("undici/types/header").IncomingHttpHeaders;
86
87
  trailers: Record<string, string>;
87
88
  opaque: T;
@@ -110,6 +111,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
110
111
  bytes: () => Uint8Array<ArrayBuffer>;
111
112
  };
112
113
  statusCode: number;
114
+ statusText: string;
113
115
  headers: import("undici/types/header").IncomingHttpHeaders;
114
116
  trailers: Record<string, string>;
115
117
  opaque: T;
@@ -138,6 +140,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
138
140
  bytes: () => Uint8Array<ArrayBuffer>;
139
141
  };
140
142
  statusCode: number;
143
+ statusText: string;
141
144
  headers: import("undici/types/header").IncomingHttpHeaders;
142
145
  trailers: Record<string, string>;
143
146
  opaque: T;
@@ -166,6 +169,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
166
169
  bytes: () => Uint8Array<ArrayBuffer>;
167
170
  };
168
171
  statusCode: number;
172
+ statusText: string;
169
173
  headers: import("undici/types/header").IncomingHttpHeaders;
170
174
  trailers: Record<string, string>;
171
175
  opaque: T;
@@ -230,6 +234,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
230
234
  bytes: () => Uint8Array<ArrayBuffer>;
231
235
  };
232
236
  statusCode: number;
237
+ statusText: string;
233
238
  headers: import("undici/types/header").IncomingHttpHeaders;
234
239
  trailers: Record<string, string>;
235
240
  opaque: T;
@@ -258,6 +263,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
258
263
  bytes: () => Uint8Array<ArrayBuffer>;
259
264
  };
260
265
  statusCode: number;
266
+ statusText: string;
261
267
  headers: import("undici/types/header").IncomingHttpHeaders;
262
268
  trailers: Record<string, string>;
263
269
  opaque: T;
@@ -286,6 +292,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
286
292
  bytes: () => Uint8Array<ArrayBuffer>;
287
293
  };
288
294
  statusCode: number;
295
+ statusText: string;
289
296
  headers: import("undici/types/header").IncomingHttpHeaders;
290
297
  trailers: Record<string, string>;
291
298
  opaque: T;
@@ -314,6 +321,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
314
321
  bytes: () => Uint8Array<ArrayBuffer>;
315
322
  };
316
323
  statusCode: number;
324
+ statusText: string;
317
325
  headers: import("undici/types/header").IncomingHttpHeaders;
318
326
  trailers: Record<string, string>;
319
327
  opaque: T;
@@ -377,6 +385,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
377
385
  bytes: () => Uint8Array<ArrayBuffer>;
378
386
  };
379
387
  statusCode: number;
388
+ statusText: string;
380
389
  headers: import("undici/types/header").IncomingHttpHeaders;
381
390
  trailers: Record<string, string>;
382
391
  opaque: T;
@@ -405,6 +414,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
405
414
  bytes: () => Uint8Array<ArrayBuffer>;
406
415
  };
407
416
  statusCode: number;
417
+ statusText: string;
408
418
  headers: import("undici/types/header").IncomingHttpHeaders;
409
419
  trailers: Record<string, string>;
410
420
  opaque: T;
@@ -433,6 +443,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
433
443
  bytes: () => Uint8Array<ArrayBuffer>;
434
444
  };
435
445
  statusCode: number;
446
+ statusText: string;
436
447
  headers: import("undici/types/header").IncomingHttpHeaders;
437
448
  trailers: Record<string, string>;
438
449
  opaque: T;
@@ -461,6 +472,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
461
472
  bytes: () => Uint8Array<ArrayBuffer>;
462
473
  };
463
474
  statusCode: number;
475
+ statusText: string;
464
476
  headers: import("undici/types/header").IncomingHttpHeaders;
465
477
  trailers: Record<string, string>;
466
478
  opaque: T;
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/context/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAG1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAEvD,KAAK,QAAQ,GAAG;IACd,MAAM,EAAE,CACN,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACzC,MAAM,CAAA;IACX,MAAM,EAAE,CACN,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GAAG,MAAM,EACpB,YAAY,CAAC,EAAE,OAAO,EACtB,sBAAsB,CAAC,EAAE,MAAM,EAAE,KAC9B,OAAO,CAAA;CACb,CAAA;AAgFD;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,GAAI,4GAUjC,yBAAyB;;;;;;;;;;;;;uBA4DP,SAAS;yBAGP,SAAS;;;;;;;;;;;;;;;;;;uBAcb,MAAM;;;;;;+BA5CU,MAAM,OAAO,QAAQ;;;;sCA1HrC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAsGT,CAAC;iCAAa,CAAC;;;;;;;;;;;;;;;;;;;kCAtGP,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAsGT,CAAC;6BAAa,CAAC;;;;;;;;;;;;;;;;;;kCAtGP,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAsGT,CAAC;6BAAa,CAAC;;;;;;;;;;;;;;;4BAyEF,MAAM,OAAO,aAAa,WAAW,SAAS;;;CAiBrE,CAAA"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/context/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAG1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAEvD,KAAK,QAAQ,GAAG;IACd,MAAM,EAAE,CACN,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACzC,MAAM,CAAA;IACX,MAAM,EAAE,CACN,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GAAG,MAAM,EACpB,YAAY,CAAC,EAAE,OAAO,EACtB,sBAAsB,CAAC,EAAE,MAAM,EAAE,KAC9B,OAAO,CAAA;CACb,CAAA;AAgFD;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,GAAI,4GAUjC,yBAAyB;;;;;;;;;;;;;uBA4DP,SAAS;yBAGP,SAAS;;;;;;;;;;;;;;;;;;uBAcb,MAAM;;;;;;+BA5CU,MAAM,OAAO,QAAQ;;;;sCA1HrC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAsGT,CAAC;iCAAa,CAAC;;;;;;;;;;;;;;;;;;;kCAtGP,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAsGT,CAAC;6BAAa,CAAC;;;;;;;;;;;;;;;;;;kCAtGP,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAsGT,CAAC;6BAAa,CAAC;;;;;;;;;;;;;;;4BAyEF,MAAM,OAAO,aAAa,WAAW,SAAS;;;CAiBrE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/roles/helpers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAIrD,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,cAAc,CAAC,QAAQ,CAAC,EAChC,aAAa,oBAAoB,EACjC,OAAO,cAAc,CAAC,MAAM,CAAC,KAC5B,OAAO,CAAC,OAAO,CAgBjB,CAAA"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/roles/helpers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAgBrD,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,cAAc,CAAC,QAAQ,CAAC,EAChC,aAAa,oBAAoB,EACjC,OAAO,cAAc,CAAC,MAAM,CAAC,KAC5B,OAAO,CAAC,OAAO,CAiBjB,CAAA"}