@flowerforce/flowerbase 1.2.1-beta.2 → 1.2.1-beta.21

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 (103) hide show
  1. package/README.md +37 -6
  2. package/dist/auth/controller.d.ts.map +1 -1
  3. package/dist/auth/controller.js +55 -4
  4. package/dist/auth/plugins/jwt.d.ts.map +1 -1
  5. package/dist/auth/plugins/jwt.js +52 -6
  6. package/dist/auth/providers/anon-user/controller.d.ts +8 -0
  7. package/dist/auth/providers/anon-user/controller.d.ts.map +1 -0
  8. package/dist/auth/providers/anon-user/controller.js +90 -0
  9. package/dist/auth/providers/anon-user/dtos.d.ts +10 -0
  10. package/dist/auth/providers/anon-user/dtos.d.ts.map +1 -0
  11. package/dist/auth/providers/anon-user/dtos.js +2 -0
  12. package/dist/auth/providers/custom-function/controller.d.ts.map +1 -1
  13. package/dist/auth/providers/custom-function/controller.js +35 -25
  14. package/dist/auth/providers/custom-function/dtos.d.ts +4 -1
  15. package/dist/auth/providers/custom-function/dtos.d.ts.map +1 -1
  16. package/dist/auth/providers/local-userpass/controller.d.ts.map +1 -1
  17. package/dist/auth/providers/local-userpass/controller.js +159 -73
  18. package/dist/auth/providers/local-userpass/dtos.d.ts +17 -2
  19. package/dist/auth/providers/local-userpass/dtos.d.ts.map +1 -1
  20. package/dist/auth/utils.d.ts +76 -14
  21. package/dist/auth/utils.d.ts.map +1 -1
  22. package/dist/auth/utils.js +55 -61
  23. package/dist/constants.d.ts +12 -0
  24. package/dist/constants.d.ts.map +1 -1
  25. package/dist/constants.js +16 -4
  26. package/dist/features/functions/controller.d.ts.map +1 -1
  27. package/dist/features/functions/controller.js +31 -12
  28. package/dist/features/functions/dtos.d.ts +3 -0
  29. package/dist/features/functions/dtos.d.ts.map +1 -1
  30. package/dist/features/functions/interface.d.ts +3 -0
  31. package/dist/features/functions/interface.d.ts.map +1 -1
  32. package/dist/features/functions/utils.d.ts +3 -2
  33. package/dist/features/functions/utils.d.ts.map +1 -1
  34. package/dist/features/functions/utils.js +19 -7
  35. package/dist/features/triggers/index.d.ts.map +1 -1
  36. package/dist/features/triggers/index.js +49 -7
  37. package/dist/features/triggers/interface.d.ts +1 -0
  38. package/dist/features/triggers/interface.d.ts.map +1 -1
  39. package/dist/features/triggers/utils.d.ts.map +1 -1
  40. package/dist/features/triggers/utils.js +67 -26
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +48 -13
  43. package/dist/services/mongodb-atlas/index.d.ts.map +1 -1
  44. package/dist/services/mongodb-atlas/index.js +72 -2
  45. package/dist/services/mongodb-atlas/model.d.ts +3 -2
  46. package/dist/services/mongodb-atlas/model.d.ts.map +1 -1
  47. package/dist/services/mongodb-atlas/utils.d.ts.map +1 -1
  48. package/dist/services/mongodb-atlas/utils.js +3 -1
  49. package/dist/shared/handleUserRegistration.d.ts.map +1 -1
  50. package/dist/shared/handleUserRegistration.js +66 -1
  51. package/dist/shared/models/handleUserRegistration.model.d.ts +2 -1
  52. package/dist/shared/models/handleUserRegistration.model.d.ts.map +1 -1
  53. package/dist/shared/models/handleUserRegistration.model.js +1 -0
  54. package/dist/utils/context/helpers.d.ts +6 -6
  55. package/dist/utils/context/helpers.d.ts.map +1 -1
  56. package/dist/utils/context/index.d.ts +1 -1
  57. package/dist/utils/context/index.d.ts.map +1 -1
  58. package/dist/utils/context/index.js +176 -9
  59. package/dist/utils/context/interface.d.ts +1 -1
  60. package/dist/utils/context/interface.d.ts.map +1 -1
  61. package/dist/utils/crypto/index.d.ts +1 -0
  62. package/dist/utils/crypto/index.d.ts.map +1 -1
  63. package/dist/utils/crypto/index.js +6 -2
  64. package/dist/utils/initializer/exposeRoutes.js +1 -1
  65. package/dist/utils/initializer/registerPlugins.d.ts.map +1 -1
  66. package/dist/utils/initializer/registerPlugins.js +12 -4
  67. package/dist/utils/roles/helpers.js +2 -1
  68. package/dist/utils/rules-matcher/utils.d.ts.map +1 -1
  69. package/dist/utils/rules-matcher/utils.js +3 -0
  70. package/package.json +1 -2
  71. package/src/auth/controller.ts +71 -5
  72. package/src/auth/plugins/jwt.test.ts +93 -0
  73. package/src/auth/plugins/jwt.ts +67 -8
  74. package/src/auth/providers/anon-user/controller.ts +91 -0
  75. package/src/auth/providers/anon-user/dtos.ts +10 -0
  76. package/src/auth/providers/custom-function/controller.ts +40 -31
  77. package/src/auth/providers/custom-function/dtos.ts +5 -1
  78. package/src/auth/providers/local-userpass/controller.ts +211 -101
  79. package/src/auth/providers/local-userpass/dtos.ts +20 -2
  80. package/src/auth/utils.ts +66 -83
  81. package/src/constants.ts +14 -2
  82. package/src/features/functions/controller.ts +42 -12
  83. package/src/features/functions/dtos.ts +3 -0
  84. package/src/features/functions/interface.ts +3 -0
  85. package/src/features/functions/utils.ts +29 -8
  86. package/src/features/triggers/index.ts +44 -1
  87. package/src/features/triggers/interface.ts +1 -0
  88. package/src/features/triggers/utils.ts +89 -37
  89. package/src/index.ts +49 -13
  90. package/src/services/mongodb-atlas/__tests__/findOneAndUpdate.test.ts +95 -0
  91. package/src/services/mongodb-atlas/index.ts +665 -567
  92. package/src/services/mongodb-atlas/model.ts +16 -3
  93. package/src/services/mongodb-atlas/utils.ts +3 -0
  94. package/src/shared/handleUserRegistration.ts +83 -2
  95. package/src/shared/models/handleUserRegistration.model.ts +2 -1
  96. package/src/utils/__tests__/registerPlugins.test.ts +5 -1
  97. package/src/utils/context/index.ts +238 -18
  98. package/src/utils/context/interface.ts +1 -1
  99. package/src/utils/crypto/index.ts +5 -1
  100. package/src/utils/initializer/exposeRoutes.ts +1 -1
  101. package/src/utils/initializer/registerPlugins.ts +8 -0
  102. package/src/utils/roles/helpers.ts +3 -2
  103. package/src/utils/rules-matcher/utils.ts +3 -0
@@ -118,18 +118,18 @@ const handleCronTrigger = (_a) => __awaiter(void 0, [_a], void 0, function* ({ c
118
118
  registerOnClose(app, () => task.stop(), 'Scheduled trigger');
119
119
  });
120
120
  const handleAuthenticationTrigger = (_a) => __awaiter(void 0, [_a], void 0, function* ({ config, triggerHandler, functionsList, services, app }) {
121
- const { database } = config;
121
+ var _b;
122
+ const { database, isAutoTrigger } = config;
123
+ const authCollection = (_b = constants_1.AUTH_CONFIG.authCollection) !== null && _b !== void 0 ? _b : 'auth_users';
124
+ const collection = app.mongo.client.db(database || constants_1.DB_NAME).collection(authCollection);
122
125
  const pipeline = [
123
126
  {
124
127
  $match: {
125
- operationType: { $in: ['insert'] }
128
+ operationType: { $in: ['insert', 'update', 'replace'] }
126
129
  }
127
130
  }
128
131
  ];
129
- const changeStream = app.mongo.client
130
- .db(database || constants_1.DB_NAME)
131
- .collection(constants_1.AUTH_CONFIG.authCollection)
132
- .watch(pipeline, {
132
+ const changeStream = collection.watch(pipeline, {
133
133
  fullDocument: 'whenAvailable'
134
134
  });
135
135
  changeStream.on('error', (error) => {
@@ -139,27 +139,68 @@ const handleAuthenticationTrigger = (_a) => __awaiter(void 0, [_a], void 0, func
139
139
  });
140
140
  changeStream.on('change', function (change) {
141
141
  return __awaiter(this, void 0, void 0, function* () {
142
- const document = change['fullDocument']; //TODO -> define user type
143
- if (document) {
144
- delete document.password;
145
- const currentUser = Object.assign({}, document);
146
- delete currentUser.password;
147
- yield (0, context_1.GenerateContext)({
148
- args: [{
149
- user: Object.assign(Object.assign({}, currentUser), { id: currentUser._id.toString(), data: {
150
- _id: currentUser._id.toString(),
151
- email: currentUser.email
152
- } })
153
- }],
154
- app,
155
- rules: state_1.StateManager.select("rules"),
156
- user: {}, // TODO from currentUser ??
157
- currentFunction: triggerHandler,
158
- functionsList,
159
- services,
160
- runAsSystem: true
161
- });
142
+ var _a, _b;
143
+ const operationType = change['operationType'];
144
+ const documentKey = change['documentKey'];
145
+ const fullDocument = change['fullDocument'];
146
+ if (!(documentKey === null || documentKey === void 0 ? void 0 : documentKey._id)) {
147
+ return;
148
+ }
149
+ const updateDescription = change['updateDescription'];
150
+ const updatedStatus = (_a = updateDescription === null || updateDescription === void 0 ? void 0 : updateDescription.updatedFields) === null || _a === void 0 ? void 0 : _a.status;
151
+ let confirmedCandidate = false;
152
+ let confirmedDocument = fullDocument;
153
+ if (operationType === 'update') {
154
+ if (updatedStatus === 'confirmed') {
155
+ confirmedCandidate = true;
156
+ }
157
+ else if (updatedStatus === undefined) {
158
+ const fetched = yield collection.findOne({
159
+ _id: documentKey._id
160
+ });
161
+ confirmedDocument = fetched !== null && fetched !== void 0 ? fetched : confirmedDocument;
162
+ confirmedCandidate = (confirmedDocument === null || confirmedDocument === void 0 ? void 0 : confirmedDocument.status) === 'confirmed';
163
+ }
164
+ }
165
+ else {
166
+ confirmedCandidate = (confirmedDocument === null || confirmedDocument === void 0 ? void 0 : confirmedDocument.status) === 'confirmed';
167
+ }
168
+ if (!confirmedCandidate) {
169
+ return;
170
+ }
171
+ const updateResult = yield collection.findOneAndUpdate({
172
+ _id: documentKey._id,
173
+ status: 'confirmed',
174
+ on_user_creation_triggered_at: { $exists: false }
175
+ }, {
176
+ $set: {
177
+ on_user_creation_triggered_at: new Date()
178
+ }
179
+ }, {
180
+ returnDocument: 'after'
181
+ });
182
+ const document = (_b = updateResult === null || updateResult === void 0 ? void 0 : updateResult.value) !== null && _b !== void 0 ? _b : confirmedDocument;
183
+ if (!document) {
184
+ return;
162
185
  }
186
+ delete document.password;
187
+ const currentUser = Object.assign({}, document);
188
+ delete currentUser.password;
189
+ const userData = Object.assign(Object.assign({}, currentUser), { id: currentUser._id.toString(), data: {
190
+ _id: currentUser._id.toString(),
191
+ email: currentUser.email
192
+ } });
193
+ // TODO change va ripulito
194
+ yield (0, context_1.GenerateContext)({
195
+ args: isAutoTrigger ? [userData] : [{ user: userData /*, ...change */ }],
196
+ app,
197
+ rules: state_1.StateManager.select("rules"),
198
+ user: {}, // TODO from currentUser ??
199
+ currentFunction: triggerHandler,
200
+ functionsList,
201
+ services,
202
+ runAsSystem: true
203
+ });
163
204
  });
164
205
  });
165
206
  registerOnClose(app, () => __awaiter(void 0, void 0, void 0, function* () {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AActB,cAAc,SAAS,CAAA;AAGvB,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;AAE/D,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,eAAe,EAAE,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,EAC/B,SAAS,EACT,IAA0B,EAC1B,SAAqC,EACrC,IAA0B,EAC1B,UAAuC,EACvC,UAAwC,EACxC,QAAQ,EACT,EAAE,gBAAgB,iBAyElB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AActB,cAAc,SAAS,CAAA;AAGvB,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;AAE/D,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,eAAe,EAAE,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,EAC/B,SAAS,EACT,IAA0B,EAC1B,SAAqC,EACrC,IAA0B,EAC1B,UAAuC,EACvC,UAAwC,EACxC,QAAQ,EACT,EAAE,gBAAgB,iBA6GlB"}
package/dist/index.js CHANGED
@@ -75,21 +75,30 @@ __exportStar(require("./model"), exports);
75
75
  function initialize(_a) {
76
76
  return __awaiter(this, arguments, void 0, function* ({ projectId, host = constants_1.DEFAULT_CONFIG.HOST, jwtSecret = constants_1.DEFAULT_CONFIG.JWT_SECRET, port = constants_1.DEFAULT_CONFIG.PORT, mongodbUrl = constants_1.DEFAULT_CONFIG.MONGODB_URL, corsConfig = constants_1.DEFAULT_CONFIG.CORS_OPTIONS, basePath }) {
77
77
  var _b, _c;
78
+ if (!jwtSecret || jwtSecret.trim().length === 0) {
79
+ throw new Error('JWT secret missing: set JWT_SECRET or pass jwtSecret to initialize()');
80
+ }
78
81
  const resolvedBasePath = (_c = basePath !== null && basePath !== void 0 ? basePath : (_b = require.main) === null || _b === void 0 ? void 0 : _b.path) !== null && _c !== void 0 ? _c : process.cwd();
79
82
  const fastify = (0, fastify_1.default)({
80
83
  logger: !!constants_1.DEFAULT_CONFIG.ENABLE_LOGGER
81
84
  });
82
- console.log("BASE PATH", resolvedBasePath);
83
- console.log("CURRENT PORT", port);
84
- console.log("CURRENT HOST", host);
85
+ const isTest = process.env.NODE_ENV === 'test' || process.env.JEST_WORKER_ID !== undefined;
86
+ const logInfo = (...args) => {
87
+ if (!isTest) {
88
+ console.log(...args);
89
+ }
90
+ };
91
+ logInfo("BASE PATH", resolvedBasePath);
92
+ logInfo("CURRENT PORT", port);
93
+ logInfo("CURRENT HOST", host);
85
94
  const functionsList = yield (0, utils_2.loadFunctions)(resolvedBasePath);
86
- console.log("Functions LOADED");
95
+ logInfo("Functions LOADED");
87
96
  const triggersList = yield (0, utils_4.loadTriggers)(resolvedBasePath);
88
- console.log("Triggers LOADED");
97
+ logInfo("Triggers LOADED");
89
98
  const endpointsList = yield (0, utils_1.loadEndpoints)(resolvedBasePath);
90
- console.log("Endpoints LOADED");
99
+ logInfo("Endpoints LOADED");
91
100
  const rulesList = yield (0, utils_3.loadRules)(resolvedBasePath);
92
- console.log("Rules LOADED");
101
+ logInfo("Rules LOADED");
93
102
  const stateConfig = {
94
103
  functions: functionsList,
95
104
  triggers: triggersList,
@@ -107,7 +116,33 @@ function initialize(_a) {
107
116
  deepLinking: false
108
117
  },
109
118
  uiHooks: {
110
- onRequest: function (request, reply, next) { next(); },
119
+ onRequest: function (request, reply, next) {
120
+ const swaggerUser = constants_1.DEFAULT_CONFIG.SWAGGER_UI_USER;
121
+ const swaggerPassword = constants_1.DEFAULT_CONFIG.SWAGGER_UI_PASSWORD;
122
+ if (!swaggerUser && !swaggerPassword) {
123
+ next();
124
+ return;
125
+ }
126
+ const authHeader = request.headers.authorization;
127
+ if (!authHeader || !authHeader.startsWith('Basic ')) {
128
+ reply
129
+ .code(401)
130
+ .header('WWW-Authenticate', 'Basic realm="Swagger UI"')
131
+ .send({ message: 'Unauthorized' });
132
+ return;
133
+ }
134
+ const encoded = authHeader.slice('Basic '.length);
135
+ const decoded = Buffer.from(encoded, 'base64').toString('utf8');
136
+ const [user, pass] = decoded.split(':');
137
+ if (user !== swaggerUser || pass !== swaggerPassword) {
138
+ reply
139
+ .code(401)
140
+ .header('WWW-Authenticate', 'Basic realm="Swagger UI"')
141
+ .send({ message: 'Unauthorized' });
142
+ return;
143
+ }
144
+ next();
145
+ },
111
146
  preHandler: function (request, reply, next) { next(); }
112
147
  },
113
148
  staticCSP: true,
@@ -122,15 +157,15 @@ function initialize(_a) {
122
157
  functionsList,
123
158
  corsConfig
124
159
  });
125
- console.log('Plugins registration COMPLETED');
160
+ logInfo('Plugins registration COMPLETED');
126
161
  yield (0, exposeRoutes_1.exposeRoutes)(fastify);
127
- console.log('APP Routes registration COMPLETED');
162
+ logInfo('APP Routes registration COMPLETED');
128
163
  yield (0, functions_1.registerFunctions)({ app: fastify, functionsList, rulesList });
129
- console.log('Functions registration COMPLETED');
164
+ logInfo('Functions registration COMPLETED');
130
165
  yield (0, endpoints_1.generateEndpoints)({ app: fastify, functionsList, endpointsList, rulesList });
131
- console.log('HTTP Endpoints registration COMPLETED');
166
+ logInfo('HTTP Endpoints registration COMPLETED');
132
167
  fastify.ready(() => {
133
- console.log("FASTIFY IS READY");
168
+ logInfo("FASTIFY IS READY");
134
169
  if ((triggersList === null || triggersList === void 0 ? void 0 : triggersList.length) > 0)
135
170
  (0, triggers_1.activateTriggers)({ fastify, triggersList, functionsList });
136
171
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAyC,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAwsBrF,QAAA,MAAM,YAAY,EAAE,oBAsBlB,CAAA;AAEF,eAAe,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAyC,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAiyBrF,QAAA,MAAM,YAAY,EAAE,oBAsBlB,CAAA;AAEF,eAAe,YAAY,CAAA"}
@@ -272,6 +272,76 @@ const getOperators = (collection, { rules, collName, user, run_as_system }) => {
272
272
  }
273
273
  return collection.updateOne(query, data, options);
274
274
  }),
275
+ /**
276
+ * Finds and updates a single document with role-based validation and access control.
277
+ *
278
+ * @param {Filter<Document>} query - The MongoDB query used to match the document to update.
279
+ * @param {UpdateFilter<Document> | Partial<Document>} data - The update operations or replacement document.
280
+ * @param {FindOneAndUpdateOptions} [options] - Optional settings for the findOneAndUpdate operation.
281
+ * @returns {Promise<FindAndModifyResult<Document>>} The result of the findOneAndUpdate operation.
282
+ *
283
+ * @throws {Error} If the user is not authorized to update the document.
284
+ */
285
+ findOneAndUpdate: (query, data, options) => __awaiter(void 0, void 0, void 0, function* () {
286
+ var _a;
287
+ if (!run_as_system) {
288
+ (0, utils_2.checkDenyOperation)(normalizedRules, collection.collectionName, model_1.CRUD_OPERATIONS.UPDATE);
289
+ const formattedQuery = (0, utils_2.getFormattedQuery)(filters, query, user);
290
+ const safeQuery = Array.isArray(formattedQuery)
291
+ ? (0, utils_2.normalizeQuery)(formattedQuery)
292
+ : formattedQuery;
293
+ const result = yield collection.findOne({ $and: safeQuery });
294
+ if (!result) {
295
+ throw new Error('Update not permitted');
296
+ }
297
+ const winningRole = (0, utils_1.getWinningRole)(result, user, roles);
298
+ const hasOperators = Object.keys(data).some((key) => key.startsWith('$'));
299
+ const pipeline = [
300
+ {
301
+ $match: { $and: safeQuery }
302
+ },
303
+ {
304
+ $limit: 1
305
+ },
306
+ ...Object.entries(data).map(([key, value]) => ({ [key]: value }))
307
+ ];
308
+ const [docToCheck] = hasOperators
309
+ ? yield collection.aggregate(pipeline).toArray()
310
+ : [data];
311
+ const { status, document } = winningRole
312
+ ? yield (0, machines_1.checkValidation)(winningRole, {
313
+ type: 'write',
314
+ roles,
315
+ cursor: docToCheck,
316
+ expansions: {}
317
+ }, user)
318
+ : fallbackAccess(docToCheck);
319
+ const areDocumentsEqual = (0, isEqual_1.default)(document, docToCheck);
320
+ if (!status || !areDocumentsEqual) {
321
+ throw new Error('Update not permitted');
322
+ }
323
+ const updateResult = options
324
+ ? yield collection.findOneAndUpdate({ $and: safeQuery }, data, options)
325
+ : yield collection.findOneAndUpdate({ $and: safeQuery }, data);
326
+ if (!updateResult) {
327
+ return updateResult;
328
+ }
329
+ const readRole = (0, utils_1.getWinningRole)(updateResult, user, roles);
330
+ const readResult = readRole
331
+ ? yield (0, machines_1.checkValidation)(readRole, {
332
+ type: 'read',
333
+ roles,
334
+ cursor: updateResult,
335
+ expansions: {}
336
+ }, user)
337
+ : fallbackAccess(updateResult);
338
+ const sanitizedDoc = readResult.status ? ((_a = readResult.document) !== null && _a !== void 0 ? _a : updateResult) : {};
339
+ return sanitizedDoc;
340
+ }
341
+ return options
342
+ ? collection.findOneAndUpdate(query, data, options)
343
+ : collection.findOneAndUpdate(query, data);
344
+ }),
275
345
  /**
276
346
  * Finds documents in a MongoDB collection with optional role-based access control and post-query validation.
277
347
  *
@@ -408,7 +478,7 @@ const getOperators = (collection, { rules, collName, user, run_as_system }) => {
408
478
  return collection.watch(pipeline, options);
409
479
  },
410
480
  //TODO -> add filter & rules in aggregate
411
- aggregate: (...args_1) => __awaiter(void 0, [...args_1], void 0, function* (pipeline = [], options, isClient) {
481
+ aggregate: (pipeline = [], options, isClient) => {
412
482
  if (run_as_system || !isClient) {
413
483
  return collection.aggregate(pipeline, options);
414
484
  }
@@ -438,7 +508,7 @@ const getOperators = (collection, { rules, collName, user, run_as_system }) => {
438
508
  const newCursor = Object.create(originalCursor);
439
509
  newCursor.toArray = () => __awaiter(void 0, void 0, void 0, function* () { return originalCursor.toArray(); });
440
510
  return newCursor;
441
- }),
511
+ },
442
512
  /**
443
513
  * Inserts multiple documents into a MongoDB collection with optional role-based access control and validation.
444
514
  *
@@ -1,5 +1,5 @@
1
1
  import { FastifyInstance } from 'fastify';
2
- import { Collection, Document, FindCursor, WithId } from 'mongodb';
2
+ import { Collection, Document, FindCursor, FindOneAndUpdateOptions, Filter as MongoFilter, UpdateFilter, WithId } from 'mongodb';
3
3
  import { User } from '../../auth/dtos';
4
4
  import { Filter, Rules } from '../../features/rules/interface';
5
5
  import { Role } from '../../utils/roles/interface';
@@ -28,9 +28,10 @@ export type GetOperatorsFunction = (collection: Collection<Document>, { rules, c
28
28
  deleteOne: (...params: Parameters<Method<'findOne'>>) => ReturnType<Method<'findOne'>>;
29
29
  insertOne: (...params: Parameters<Method<'insertOne'>>) => ReturnType<Method<'insertOne'>>;
30
30
  updateOne: (...params: Parameters<Method<'updateOne'>>) => ReturnType<Method<'updateOne'>>;
31
+ findOneAndUpdate: (filter: MongoFilter<Document>, update: UpdateFilter<Document> | Document[], options?: FindOneAndUpdateOptions) => Promise<Document | null>;
31
32
  find: (...params: Parameters<Method<'find'>>) => FindCursor;
32
33
  watch: (...params: Parameters<Method<'watch'>>) => ReturnType<Method<'watch'>>;
33
- aggregate: (...params: [...Parameters<Method<'aggregate'>>, isClient: boolean]) => Promise<ReturnType<Method<'aggregate'>>>;
34
+ aggregate: (...params: [...Parameters<Method<'aggregate'>>, isClient: boolean]) => ReturnType<Method<'aggregate'>>;
34
35
  insertMany: (...params: Parameters<Method<'insertMany'>>) => ReturnType<Method<'insertMany'>>;
35
36
  updateMany: (...params: Parameters<Method<'updateMany'>>) => ReturnType<Method<'updateMany'>>;
36
37
  deleteMany: (...params: Parameters<Method<'deleteMany'>>) => ReturnType<Method<'deleteMany'>>;
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/model.ts"],"names":[],"mappings":"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"}
@@ -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,QA2BvB,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,EAAE,YAAK,EACtB,OAAO,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EACrD,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;;;;;;;;iBA2Hs1rS,CAAC;sBAAgC,CAAC;2BAAsC,CAAC;;;;IAnH79rS;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,SAAS,MAAM,EAAE,YAAK,EACtB,OAAO,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EACrD,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;;;;;;;;iBA2HwvrS,CAAC;sBAAgC,CAAC;2BAAsC,CAAC;;;;IAnH/3rS;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"}
@@ -16,18 +16,20 @@ const model_1 = require("./model");
16
16
  const getValidRule = ({ filters = [], user, record = null }) => {
17
17
  if (!filters.length)
18
18
  return [];
19
+ const rootRecord = record !== null && record !== void 0 ? record : null;
19
20
  return filters.filter((f) => {
20
21
  if (Object.keys(f.apply_when).length === 0)
21
22
  return true;
22
23
  // expandQuery traduce i placeholder (%%user, %%true)
23
24
  const conditions = (0, rules_1.expandQuery)(f.apply_when, {
25
+ '%%root': rootRecord,
24
26
  '%%user': user,
25
27
  '%%true': true
26
28
  /** values */
27
29
  });
28
30
  // checkRule valuta se i campi del record soddisfano quella condizione.
29
31
  // Quindi le regole vengono effettivamente rispettate.
30
- const valid = utils_1.default.checkRule(conditions, Object.assign(Object.assign({}, (record !== null && record !== void 0 ? record : {})), { '%%user': user, '%%true': true }), {});
32
+ const valid = utils_1.default.checkRule(conditions, Object.assign(Object.assign({}, (record !== null && record !== void 0 ? record : {})), { '%%root': rootRecord, '%%user': user, '%%true': true }), {});
31
33
  return valid;
32
34
  });
33
35
  };
@@ -1 +1 @@
1
- {"version":3,"file":"handleUserRegistration.d.ts","sourceRoot":"","sources":["../../src/shared/handleUserRegistration.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAA;AAE9E;;;;;;GAMG;AACH,QAAA,MAAM,sBAAsB,EAAE,sBAmD7B,CAAA;AAED,eAAe,sBAAsB,CAAA"}
1
+ {"version":3,"file":"handleUserRegistration.d.ts","sourceRoot":"","sources":["../../src/shared/handleUserRegistration.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAA;AAE9E;;;;;;GAMG;AACH,QAAA,MAAM,sBAAsB,EAAE,sBAkI7B,CAAA;AAED,eAAe,sBAAsB,CAAA"}
@@ -10,6 +10,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  const constants_1 = require("../constants");
13
+ const state_1 = require("../state");
14
+ const context_1 = require("../utils/context");
13
15
  const crypto_1 = require("../utils/crypto");
14
16
  /**
15
17
  * Register user
@@ -19,11 +21,16 @@ const crypto_1 = require("../utils/crypto");
19
21
  * @returns {Promise<InsertOneResult<Document>>} A promise resolving to the result of the insert operation.
20
22
  */
21
23
  const handleUserRegistration = (app, opt) => (_a) => __awaiter(void 0, [_a], void 0, function* ({ email, password }) {
24
+ var _b;
22
25
  const { run_as_system, skipUserCheck, provider } = opt !== null && opt !== void 0 ? opt : {};
23
26
  if (!run_as_system) {
24
27
  throw new Error('only run_as_system');
25
28
  }
26
29
  const { authCollection } = constants_1.AUTH_CONFIG;
30
+ const localUserpassConfig = constants_1.AUTH_CONFIG.localUserpassConfig;
31
+ const autoConfirm = (localUserpassConfig === null || localUserpassConfig === void 0 ? void 0 : localUserpassConfig.autoConfirm) === true;
32
+ const runConfirmationFunction = (localUserpassConfig === null || localUserpassConfig === void 0 ? void 0 : localUserpassConfig.runConfirmationFunction) === true;
33
+ const confirmationFunctionName = localUserpassConfig === null || localUserpassConfig === void 0 ? void 0 : localUserpassConfig.confirmationFunctionName;
27
34
  const mongo = app === null || app === void 0 ? void 0 : app.mongo;
28
35
  const db = mongo.client.db(constants_1.DB_NAME);
29
36
  const hashedPassword = yield (0, crypto_1.hashPassword)(password);
@@ -34,7 +41,7 @@ const handleUserRegistration = (app, opt) => (_a) => __awaiter(void 0, [_a], voi
34
41
  const result = yield (db === null || db === void 0 ? void 0 : db.collection(authCollection).insertOne({
35
42
  email,
36
43
  password: hashedPassword,
37
- status: skipUserCheck ? 'confirmed' : 'pending',
44
+ status: skipUserCheck || autoConfirm ? 'confirmed' : 'pending',
38
45
  createdAt: new Date(),
39
46
  custom_data: {
40
47
  // TODO: aggiungere dati personalizzati alla registrazione
@@ -58,6 +65,64 @@ const handleUserRegistration = (app, opt) => (_a) => __awaiter(void 0, [_a], voi
58
65
  ]
59
66
  }
60
67
  }));
68
+ if (!(result === null || result === void 0 ? void 0 : result.insertedId) || skipUserCheck || autoConfirm) {
69
+ return result;
70
+ }
71
+ if (!runConfirmationFunction) {
72
+ throw new Error('Missing confirmation function');
73
+ }
74
+ if (!confirmationFunctionName) {
75
+ throw new Error('Missing confirmation function name');
76
+ }
77
+ const functionsList = state_1.StateManager.select('functions');
78
+ const services = state_1.StateManager.select('services');
79
+ const confirmationFunction = functionsList[confirmationFunctionName];
80
+ if (!confirmationFunction) {
81
+ throw new Error(`Confirmation function not found: ${confirmationFunctionName}`);
82
+ }
83
+ const token = (0, crypto_1.generateToken)();
84
+ const tokenId = (0, crypto_1.generateToken)();
85
+ yield (db === null || db === void 0 ? void 0 : db.collection(authCollection).updateOne({ _id: result.insertedId }, {
86
+ $set: {
87
+ confirmationToken: token,
88
+ confirmationTokenId: tokenId
89
+ }
90
+ }));
91
+ let confirmationStatus = 'fail';
92
+ try {
93
+ const response = yield (0, context_1.GenerateContext)({
94
+ args: [{
95
+ token,
96
+ tokenId,
97
+ username: email
98
+ }],
99
+ app,
100
+ rules: {},
101
+ user: {},
102
+ currentFunction: confirmationFunction,
103
+ functionsList,
104
+ services,
105
+ runAsSystem: true
106
+ });
107
+ confirmationStatus = (_b = response === null || response === void 0 ? void 0 : response.status) !== null && _b !== void 0 ? _b : 'fail';
108
+ }
109
+ catch (_c) {
110
+ confirmationStatus = 'fail';
111
+ }
112
+ if (confirmationStatus === 'success') {
113
+ yield (db === null || db === void 0 ? void 0 : db.collection(authCollection).updateOne({ _id: result.insertedId }, {
114
+ $set: { status: 'confirmed' },
115
+ $unset: { confirmationToken: '', confirmationTokenId: '' }
116
+ }));
117
+ return result;
118
+ }
119
+ if (confirmationStatus === 'pending') {
120
+ return result;
121
+ }
122
+ yield (db === null || db === void 0 ? void 0 : db.collection(authCollection).updateOne({ _id: result.insertedId }, {
123
+ $set: { status: 'failed' },
124
+ $unset: { confirmationToken: '', confirmationTokenId: '' }
125
+ }));
61
126
  return result;
62
127
  });
63
128
  exports.default = handleUserRegistration;
@@ -20,7 +20,8 @@ type RegistrationResult = {
20
20
  export type HandleUserRegistration = (app: FastifyInstance, opt: Options) => (params: RegistrationParams) => Promise<RegistrationResult>;
21
21
  export declare enum PROVIDER {
22
22
  LOCAL_USERPASS = "local-userpass",
23
- CUSTOM_FUNCTION = "custom-function"
23
+ CUSTOM_FUNCTION = "custom-function",
24
+ ANON_USER = "anon-user"
24
25
  }
25
26
  export {};
26
27
  //# sourceMappingURL=handleUserRegistration.model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handleUserRegistration.model.d.ts","sourceRoot":"","sources":["../../../src/shared/models/handleUserRegistration.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAA;AAEtD,KAAK,kBAAkB,GAAG;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAED,KAAK,kBAAkB,GAAG;IACxB,UAAU,CAAC,EAAE;QACX,QAAQ,EAAE,MAAM,MAAM,CAAA;KACvB,CAAA;CACF,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,CACnC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,OAAO,KACT,CAAC,MAAM,EAAE,kBAAkB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;AAEhE,oBAAY,QAAQ;IAClB,cAAc,mBAAmB;IACjC,eAAe,oBAAoB;CACpC"}
1
+ {"version":3,"file":"handleUserRegistration.model.d.ts","sourceRoot":"","sources":["../../../src/shared/models/handleUserRegistration.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAA;AAEtD,KAAK,kBAAkB,GAAG;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAED,KAAK,kBAAkB,GAAG;IACxB,UAAU,CAAC,EAAE;QACX,QAAQ,EAAE,MAAM,MAAM,CAAA;KACvB,CAAA;CACF,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,CACnC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,OAAO,KACT,CAAC,MAAM,EAAE,kBAAkB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;AAEhE,oBAAY,QAAQ;IAClB,cAAc,mBAAmB;IACjC,eAAe,oBAAoB;IACnC,SAAS,cAAc;CACxB"}
@@ -5,4 +5,5 @@ var PROVIDER;
5
5
  (function (PROVIDER) {
6
6
  PROVIDER["LOCAL_USERPASS"] = "local-userpass";
7
7
  PROVIDER["CUSTOM_FUNCTION"] = "custom-function";
8
+ PROVIDER["ANON_USER"] = "anon-user";
8
9
  })(PROVIDER || (exports.PROVIDER = PROVIDER = {}));
@@ -23,10 +23,10 @@ export declare const generateContextData: ({ user, services, app, rules, current
23
23
  method?: string | undefined;
24
24
  url?: string | undefined;
25
25
  host?: string | undefined;
26
- id?: string | undefined;
27
26
  ips?: string[];
28
27
  hostname?: string | undefined;
29
28
  ip?: string | undefined;
29
+ id?: string | undefined;
30
30
  };
31
31
  user: unknown;
32
32
  environment: {
@@ -69,20 +69,20 @@ export declare const generateContextData: ({ user, services, app, rules, current
69
69
  message: string;
70
70
  };
71
71
  } | import("undici").Dispatcher.ResponseData<T>>;
72
- } | {
73
- emailPasswordAuth: {
74
- registerUser: ReturnType<import("../../shared/models/handleUserRegistration.model").HandleUserRegistration>;
75
- };
76
72
  } | {
77
73
  lambda: (region: string) => import("aws-sdk").Lambda & {
78
74
  Invoke: (...args: Parameters<import("aws-sdk").Lambda["invoke"]>) => Promise<import("aws-sdk/lib/request").PromiseResult<import("aws-sdk/clients/lambda").InvocationResponse, import("aws-sdk").AWSError>>;
79
75
  InvokeAsync: import("aws-sdk").Lambda["invokeAsync"];
80
76
  };
81
77
  s3: (region: string) => import("aws-sdk").S3;
78
+ } | {
79
+ emailPasswordAuth: {
80
+ registerUser: ReturnType<import("../../shared/models/handleUserRegistration.model").HandleUserRegistration>;
81
+ };
82
82
  } | undefined;
83
83
  };
84
84
  functions: {
85
- execute: (name: keyof typeof functionsList, ...args: Arguments) => Promise<void>;
85
+ execute: (name: keyof typeof functionsList, ...args: Arguments) => Promise<unknown>;
86
86
  };
87
87
  };
88
88
  };
@@ -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;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAEvD;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,GAAI,0FASjC,yBAAyB;;;uBAGT,SAAS;yBAGP,SAAS;;;;;;;;;;;;;;;;;;uBAcb,MAAM;;;+BAGE,MAAM,OAAO,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAlCG,GAE3C;;;;;;;4BAiDgB,MAAM,OAAO,aAAa,WAAW,SAAS;;;CAclE,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;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAEvD;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,GAAI,0FASjC,yBAAyB;;;uBAGT,SAAS;yBAGP,SAAS;;;;;;;;;;;;;;;;;;uBAcb,MAAM;;;+BAGE,MAAM,OAAO,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAlCG,GAE3C;;;;;;;;;;;4BAiDgB,MAAM,OAAO,aAAa,WAAW,SAAS;;;CAclE,CAAA"}
@@ -10,5 +10,5 @@ import { GenerateContextParams } from './interface';
10
10
  * @param functionsList -> the list of all functions
11
11
  * @param services -> the list of all services
12
12
  */
13
- export declare function GenerateContext({ args, app, rules, user, currentFunction, functionsList, services, runAsSystem, deserializeArgs, enqueue, request }: GenerateContextParams): Promise<any>;
13
+ export declare function GenerateContext({ args, app, rules, user, currentFunction, functionsList, services, runAsSystem, deserializeArgs, enqueue, request }: GenerateContextParams): Promise<unknown>;
14
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/context/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEnD;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,EACpC,IAAI,EACJ,GAAG,EACH,KAAK,EACL,IAAI,EACJ,eAAe,EACf,aAAa,EACb,QAAQ,EACR,WAAW,EACX,eAAsB,EACtB,OAAO,EACP,OAAO,EACR,EAAE,qBAAqB,gBA4CvB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/context/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AA0GnD;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,EACpC,IAAI,EACJ,GAAG,EACH,KAAK,EACL,IAAI,EACJ,eAAe,EACf,aAAa,EACb,QAAQ,EACR,WAAW,EACX,eAAsB,EACtB,OAAO,EACP,OAAO,EACR,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,CA8J1C"}