@flusys/nestjs-shared 9.1.2 → 9.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +94 -18
  2. package/classes/api-controller.class.d.ts +1 -0
  3. package/classes/api-service.class.d.ts +7 -2
  4. package/classes/hybrid-cache.class.d.ts +17 -4
  5. package/constants/index.d.ts +1 -0
  6. package/constants/permissions.d.ts +9 -0
  7. package/fesm/183.js +7 -7
  8. package/fesm/{282.js → 47.js} +98 -158
  9. package/fesm/470.js +333 -382
  10. package/fesm/667.js +17 -17
  11. package/fesm/681.js +326 -129
  12. package/fesm/{948.js → 997.js} +45 -23
  13. package/fesm/chunks/123.js +17 -9
  14. package/fesm/chunks/37.js +5 -5
  15. package/fesm/classes/index.js +4 -3
  16. package/fesm/constants/index.js +18 -7
  17. package/fesm/decorators/index.js +120 -39
  18. package/fesm/dtos/index.js +1 -1
  19. package/fesm/entities/index.js +8 -8
  20. package/fesm/enums/index.js +2 -2
  21. package/fesm/exceptions/index.js +12 -12
  22. package/fesm/guards/index.js +201 -68
  23. package/fesm/index.js +50 -41
  24. package/fesm/interceptors/index.js +290 -590
  25. package/fesm/interfaces/index.js +17 -8
  26. package/fesm/middlewares/index.js +4 -4
  27. package/fesm/modules/index.js +2 -2
  28. package/fesm/pipes/index.js +8 -8
  29. package/fesm/utils/index.js +137 -478
  30. package/interceptors/idempotency.interceptor.d.ts +14 -2
  31. package/interceptors/slug.interceptor.d.ts +1 -0
  32. package/interfaces/permission-action-registry.interface.d.ts +1 -0
  33. package/interfaces/permission.interface.d.ts +1 -0
  34. package/modules/shared-permission-cache/shared-permission-cache.service.d.ts +3 -1
  35. package/modules/utils/utils.service.d.ts +6 -6
  36. package/package.json +2 -2
  37. package/utils/date-time.util.d.ts +0 -1
  38. package/utils/event-pattern.util.d.ts +1 -0
  39. package/utils/permission-cache-key.util.d.ts +3 -0
  40. package/utils/query-helpers.util.d.ts +2 -2
@@ -1,451 +1,11 @@
1
- import * as __rspack_external__flusys_nestjs_core_config_197fa0a9 from "@flusys/nestjs-core/config";
2
- import * as __rspack_external__nestjs_common_a04939da from "@nestjs/common";
3
1
  import * as __rspack_external_crypto from "crypto";
2
+ import * as __rspack_external_typeorm from "typeorm";
4
3
  export const __rspack_esm_id = 152;
5
4
  export const __rspack_esm_ids = [152];
6
5
  export const __webpack_modules__ = {
7
- 43(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
8
- /* import */ var _permissions_js__rspack_import_0 = __webpack_require__(975);
9
- /* import */ var _message_keys_js__rspack_import_1 = __webpack_require__(389);
10
- // Metadata keys
11
- const IS_PUBLIC_KEY = 'isPublic';
12
- const PERMISSIONS_KEY = 'permissions';
13
- const DOMAIN_EVENT_HANDLER_KEY = 'domainEventHandler';
14
- // Injection tokens
15
- const CACHE_INSTANCE = 'CACHE_INSTANCE';
16
- const PERMISSION_GUARD_CONFIG = 'PERMISSION_GUARD_CONFIG';
17
- const EVENT_BUS_INSTANCE = 'EVENT_BUS_INSTANCE';
18
- const EVENT_BUS_MODULE_OPTIONS = 'EVENT_BUS_MODULE_OPTIONS';
19
- // Header names
20
- const IDEMPOTENCY_KEY_HEADER = 'x-idempotency-key';
21
- const REQUEST_ID_HEADER = 'x-request-id';
22
- const CLIENT_TYPE_HEADER = 'x-client-type';
23
- // Cache key prefixes
24
- const PERMISSIONS_CACHE_PREFIX = 'my-permissions';
25
- const IDEMPOTENCY_CACHE_PREFIX = 'idempotency';
26
- // Event bus defaults
27
- const DEFAULT_EVENT_EXCHANGE = 'flusys.events';
28
- const DEFAULT_EVENT_TOPIC = 'flusys.domain-events';
29
- const DEFAULT_EVENT_SERVICE_NAME = 'flusys';
30
- // Permission codes
31
-
32
- // Message keys for localization
33
-
34
-
35
- __webpack_require__.d(__webpack_exports__, {
36
- BC: () => (/* reexport safe */ _permissions_js__rspack_import_0.BC),
37
- Bz: () => (/* reexport safe */ _permissions_js__rspack_import_0.Bz),
38
- DP: () => (/* reexport safe */ _permissions_js__rspack_import_0.DP),
39
- Em: () => (/* reexport safe */ _permissions_js__rspack_import_0.Em),
40
- G0: () => (/* reexport safe */ _permissions_js__rspack_import_0.G0),
41
- GH: () => (/* reexport safe */ _permissions_js__rspack_import_0.GH),
42
- GT: () => (/* reexport safe */ _permissions_js__rspack_import_0.GT),
43
- Jj: () => (/* reexport safe */ _permissions_js__rspack_import_0.Jj),
44
- N3: () => (/* reexport safe */ _permissions_js__rspack_import_0.N3),
45
- ON: () => (/* reexport safe */ _permissions_js__rspack_import_0.ON),
46
- P0: () => (/* reexport safe */ _permissions_js__rspack_import_0.P0),
47
- Q5: () => (/* reexport safe */ _permissions_js__rspack_import_0.Q5),
48
- S6: () => (/* reexport safe */ _permissions_js__rspack_import_0.S6),
49
- T: () => (/* reexport safe */ _permissions_js__rspack_import_0.T),
50
- UB: () => (/* reexport safe */ _permissions_js__rspack_import_0.UB),
51
- UG: () => (/* reexport safe */ _permissions_js__rspack_import_0.UG),
52
- UU: () => (/* reexport safe */ _message_keys_js__rspack_import_1.UU),
53
- Ub: () => (/* reexport safe */ _permissions_js__rspack_import_0.Ub),
54
- V0: () => (/* reexport safe */ _permissions_js__rspack_import_0.V0),
55
- Wc: () => (/* reexport safe */ _permissions_js__rspack_import_0.Wc),
56
- Y3: () => (/* reexport safe */ _permissions_js__rspack_import_0.Y3),
57
- Y7: () => (/* reexport safe */ _permissions_js__rspack_import_0.Y7),
58
- _X: () => (/* reexport safe */ _permissions_js__rspack_import_0._X),
59
- aO: () => (/* reexport safe */ _permissions_js__rspack_import_0.aO),
60
- aT: () => (/* reexport safe */ _permissions_js__rspack_import_0.aT),
61
- fS: () => (/* reexport safe */ _permissions_js__rspack_import_0.fS),
62
- hg: () => (/* reexport safe */ _message_keys_js__rspack_import_1.hg),
63
- kA: () => (/* reexport safe */ _permissions_js__rspack_import_0.kA),
64
- kd: () => (/* reexport safe */ _permissions_js__rspack_import_0.kd),
65
- l3: () => (/* reexport safe */ _permissions_js__rspack_import_0.l3),
66
- mK: () => (/* reexport safe */ _message_keys_js__rspack_import_1.mK),
67
- mV: () => (/* reexport safe */ _permissions_js__rspack_import_0.mV),
68
- rH: () => (/* reexport safe */ _permissions_js__rspack_import_0.rH),
69
- t$: () => (/* reexport safe */ _permissions_js__rspack_import_0.t$),
70
- w7: () => (/* reexport safe */ _permissions_js__rspack_import_0.w7),
71
- wA: () => (/* reexport safe */ _permissions_js__rspack_import_0.wA),
72
- wM: () => (/* reexport safe */ _permissions_js__rspack_import_0.wM),
73
- z$: () => (/* reexport safe */ _permissions_js__rspack_import_0.z$),
74
- zd: () => (/* reexport safe */ _permissions_js__rspack_import_0.zd)
75
- }, {
76
- Hq: DEFAULT_EVENT_EXCHANGE,
77
- Lw: PERMISSION_GUARD_CONFIG,
78
- N7: PERMISSIONS_KEY,
79
- PT: DOMAIN_EVENT_HANDLER_KEY,
80
- Qj: EVENT_BUS_INSTANCE,
81
- SL: EVENT_BUS_MODULE_OPTIONS,
82
- fG: PERMISSIONS_CACHE_PREFIX,
83
- iH: IDEMPOTENCY_KEY_HEADER,
84
- jA: IS_PUBLIC_KEY,
85
- kC: REQUEST_ID_HEADER,
86
- mg: IDEMPOTENCY_CACHE_PREFIX,
87
- nx: DEFAULT_EVENT_TOPIC,
88
- xw: CLIENT_TYPE_HEADER,
89
- zl: CACHE_INSTANCE
90
- });
91
-
92
-
93
- },
94
- 389(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
95
- // ==================== AUTH (Shared across guards/interceptors) ====================
96
- // These are duplicated in nestjs-auth but needed here to avoid circular dependencies
97
- const AUTH_MESSAGES = {
98
- TOKEN_REQUIRED: 'auth.token.required',
99
- TOKEN_INVALID: 'auth.token.invalid',
100
- ENTITY_BELOG_ANOTHER_COMPANY: 'entity.belongs.another.company',
101
- COMPANY_NO_ACCESS: 'auth.company.no.access'
102
- };
103
- // ==================== ERROR (HTTP Exceptions) ====================
104
- const ERROR_MESSAGES = {
105
- NOT_FOUND: 'error.not.found',
106
- VALIDATION: 'error.validation',
107
- UNAUTHORIZED: 'error.unauthorized',
108
- FORBIDDEN: 'error.forbidden',
109
- CONFLICT: 'error.conflict',
110
- DB_FOREIGN_KEY: 'error.db.foreign.key',
111
- DB_NOT_NULL: 'error.db.not.null',
112
- DB_INVALID_INPUT: 'error.db.invalid.input',
113
- DB_VALUE_TOO_LONG: 'error.db.value.too.long',
114
- DB_CHECK_CONSTRAINT: 'error.db.check.constraint',
115
- DB_DEADLOCK: 'error.db.deadlock',
116
- INTERNAL: 'error.internal',
117
- SERVICE_UNAVAILABLE: 'error.service.unavailable',
118
- UNKNOWN: 'error.unknown',
119
- HTTP: 'error.http',
120
- GENERIC: 'error.generic',
121
- PERMISSION_SYSTEM_UNAVAILABLE: 'error.permission.system.unavailable',
122
- INSUFFICIENT_PERMISSIONS: 'error.insufficient.permissions',
123
- INSUFFICIENT_PERMISSIONS_OR: 'error.insufficient.permissions.or',
124
- NO_PERMISSIONS_FOUND: 'error.no.permissions.found',
125
- ENDPOINT_DISABLED: 'error.endpoint.disabled'
126
- };
127
- // ==================== SYSTEM (Infrastructure) ====================
128
- const SYSTEM_MESSAGES = {
129
- REPOSITORY_NOT_AVAILABLE: 'system.repository.not.available',
130
- DATASOURCE_NOT_AVAILABLE: 'system.datasource.not.available',
131
- DATABASE_CONFIG_NOT_AVAILABLE: 'system.database.config.not.available',
132
- SERVICE_NOT_AVAILABLE: 'system.service.not.available',
133
- CONFIG_REQUIRED: 'system.config.required',
134
- INTERNAL_ERROR: 'system.internal.error',
135
- DUPLICATE_REQUEST: 'system.duplicate.request',
136
- INVALID_TENANT_ID: 'system.invalid.tenant.id',
137
- TENANT_NOT_FOUND: 'system.tenant.not.found',
138
- TENANT_HEADER_REQUIRED: 'system.tenant.header.required',
139
- MISSING_PARAMETER: 'system.missing.parameter',
140
- SDK_NOT_INSTALLED: 'system.sdk.not.installed',
141
- PATH_TRAVERSAL_DETECTED: 'system.path.traversal.detected',
142
- INVALID_FILE_KEY: 'system.invalid.file.key'
143
- };
144
-
145
- __webpack_require__.d(__webpack_exports__, {
146
- }, {
147
- UU: ERROR_MESSAGES,
148
- hg: SYSTEM_MESSAGES,
149
- mK: AUTH_MESSAGES
150
- });
151
-
152
-
153
- },
154
- 975(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
155
- // ==================== AUTH MODULE ====================
156
- const USER_PERMISSIONS = {
157
- CREATE: 'user.create',
158
- READ: 'user.read',
159
- UPDATE: 'user.update',
160
- DELETE: 'user.delete',
161
- LOOKUP: 'user.lookup'
162
- };
163
- const COMPANY_PERMISSIONS = {
164
- CREATE: 'company.create',
165
- READ: 'company.read',
166
- UPDATE: 'company.update',
167
- DELETE: 'company.delete'
168
- };
169
- const BRANCH_PERMISSIONS = {
170
- CREATE: 'branch.create',
171
- READ: 'branch.read',
172
- UPDATE: 'branch.update',
173
- DELETE: 'branch.delete'
174
- };
175
- const SOCIAL_AUTH_CONFIG_PERMISSIONS = {
176
- CREATE: 'social-config.create',
177
- READ: 'social-config.read',
178
- UPDATE: 'social-config.update',
179
- DELETE: 'social-config.delete'
180
- };
181
- // ==================== IAM MODULE ====================
182
- const ACTION_PERMISSIONS = {
183
- CREATE: 'action.create',
184
- READ: 'action.read',
185
- UPDATE: 'action.update',
186
- DELETE: 'action.delete'
187
- };
188
- const ROLE_PERMISSIONS = {
189
- CREATE: 'role.create',
190
- READ: 'role.read',
191
- UPDATE: 'role.update',
192
- DELETE: 'role.delete'
193
- };
194
- const ROLE_ACTION_PERMISSIONS = {
195
- READ: 'role-action.read',
196
- ASSIGN: 'role-action.assign'
197
- };
198
- const USER_ROLE_PERMISSIONS = {
199
- READ: 'user-role.read',
200
- ASSIGN: 'user-role.assign'
201
- };
202
- const USER_ACTION_PERMISSIONS = {
203
- READ: 'user-action.read',
204
- ASSIGN: 'user-action.assign'
205
- };
206
- const COMPANY_ACTION_PERMISSIONS = {
207
- READ: 'company-action.read',
208
- ASSIGN: 'company-action.assign'
209
- };
210
- // ==================== STORAGE MODULE ====================
211
- const FILE_PERMISSIONS = {
212
- CREATE: 'file.create',
213
- READ: 'file.read',
214
- UPDATE: 'file.update',
215
- DELETE: 'file.delete',
216
- VIEW_PRIVATE_ACTION: 'file.view.private'
217
- };
218
- const FOLDER_PERMISSIONS = {
219
- CREATE: 'folder.create',
220
- READ: 'folder.read',
221
- UPDATE: 'folder.update',
222
- DELETE: 'folder.delete'
223
- };
224
- const STORAGE_CONFIG_PERMISSIONS = {
225
- CREATE: 'storage-config.create',
226
- READ: 'storage-config.read',
227
- UPDATE: 'storage-config.update',
228
- DELETE: 'storage-config.delete'
229
- };
230
- const UPLOAD_CONFIG_PERMISSIONS = {
231
- DELETE: 'upload-config.delete'
232
- };
233
- // ==================== EMAIL MODULE ====================
234
- const EMAIL_CONFIG_PERMISSIONS = {
235
- CREATE: 'email-config.create',
236
- READ: 'email-config.read',
237
- UPDATE: 'email-config.update',
238
- DELETE: 'email-config.delete'
239
- };
240
- const EMAIL_TEMPLATE_PERMISSIONS = {
241
- CREATE: 'email-template.create',
242
- READ: 'email-template.read',
243
- UPDATE: 'email-template.update',
244
- DELETE: 'email-template.delete'
245
- };
246
- // ==================== FORM BUILDER MODULE ====================
247
- const FORM_PERMISSIONS = {
248
- CREATE: 'form.create',
249
- READ: 'form.read',
250
- UPDATE: 'form.update',
251
- DELETE: 'form.delete'
252
- };
253
- const FORM_RESULT_PERMISSIONS = {
254
- CREATE: 'form-result.create',
255
- READ: 'form-result.read',
256
- UPDATE: 'form-result.update',
257
- DELETE: 'form-result.delete'
258
- };
259
- // ==================== ENTITY BUILDER MODULE ====================
260
- // Static metadata permissions only. Per-dynamic-entity record permissions
261
- // (`entity_builder.entity.<entityCode>.<action>`) are checked by flows running as the caller;
262
- // ENTITY_BUILDER_ALL_DYNAMIC is the wildcard that grants all of them (and nothing else).
263
- const ENTITY_DEFINITION_PERMISSIONS = {
264
- CREATE: 'entity_builder.entity_definition.create',
265
- READ: 'entity_builder.entity_definition.read',
266
- UPDATE: 'entity_builder.entity_definition.update',
267
- DELETE: 'entity_builder.entity_definition.delete'
268
- };
269
- const FIELD_DEFINITION_PERMISSIONS = {
270
- READ: 'entity_builder.field_definition.read',
271
- UPDATE: 'entity_builder.field_definition.update'
272
- };
273
- const FLOW_DEFINITION_PERMISSIONS = {
274
- CREATE: 'entity_builder.flow_definition.create',
275
- READ: 'entity_builder.flow_definition.read',
276
- UPDATE: 'entity_builder.flow_definition.update',
277
- DELETE: 'entity_builder.flow_definition.delete',
278
- TEST: 'entity_builder.flow_definition.test',
279
- /** Needed to save a flow containing a code node (sandboxed JavaScript). */ CODE: 'entity_builder.flow_definition.code'
280
- };
281
- const ENTITY_BUILDER_DYNAMIC_PREFIX = 'entity_builder.entity';
282
- const ENTITY_BUILDER_ALL_DYNAMIC = {
283
- ALL: `${ENTITY_BUILDER_DYNAMIC_PREFIX}.*`
284
- };
285
- const dynamicEntityPermissionParent = (entityCode)=>`${ENTITY_BUILDER_DYNAMIC_PREFIX}.${entityCode}`;
286
- const dynamicEntityPermission = (entityCode, action)=>`${dynamicEntityPermissionParent(entityCode)}.${action}`;
287
- // ==================== EVENT MANAGER MODULE ====================
288
- const EVENT_PERMISSIONS = {
289
- CREATE: 'event.create',
290
- READ: 'event.read',
291
- UPDATE: 'event.update',
292
- DELETE: 'event.delete'
293
- };
294
- // ==================== NOTIFICATION MODULE ====================
295
- const NOTIFICATION_PERMISSIONS = {
296
- CREATE: 'notification.create',
297
- READ: 'notification.read',
298
- UPDATE: 'notification.update',
299
- DELETE: 'notification.delete'
300
- };
301
- // ==================== LOCALIZATION MODULE ====================
302
- const LANGUAGE_PERMISSIONS = {
303
- CREATE: 'language.create',
304
- READ: 'language.read',
305
- UPDATE: 'language.update',
306
- DELETE: 'language.delete'
307
- };
308
- const TRANSLATION_KEY_PERMISSIONS = {
309
- CREATE: 'translation-key.create',
310
- READ: 'translation-key.read',
311
- UPDATE: 'translation-key.update',
312
- DELETE: 'translation-key.delete'
313
- };
314
- const TRANSLATION_PERMISSIONS = {
315
- CREATE: 'translation.create',
316
- READ: 'translation.read',
317
- UPDATE: 'translation.update',
318
- DELETE: 'translation.delete'
319
- };
320
- // ==================== TASK MANAGER MODULE ====================
321
- const TASK_BOARD_PERMISSIONS = {
322
- CREATE: 'task-board.create',
323
- READ: 'task-board.read',
324
- UPDATE: 'task-board.update',
325
- DELETE: 'task-board.delete',
326
- MANAGE_MEMBERS: 'task-board.manage-members'
327
- };
328
- const TASK_LIST_PERMISSIONS = {
329
- CREATE: 'task-list.create',
330
- READ: 'task-list.read',
331
- UPDATE: 'task-list.update',
332
- DELETE: 'task-list.delete'
333
- };
334
- const TASK_PERMISSIONS = {
335
- CREATE: 'task.create',
336
- READ: 'task.read',
337
- UPDATE: 'task.update',
338
- DELETE: 'task.delete',
339
- MOVE: 'task.move',
340
- ASSIGN: 'task.assign'
341
- };
342
- const TASK_LABEL_PERMISSIONS = {
343
- CREATE: 'task-label.create',
344
- READ: 'task-label.read',
345
- UPDATE: 'task-label.update',
346
- DELETE: 'task-label.delete'
347
- };
348
- const TASK_COMMENT_PERMISSIONS = {
349
- CREATE: 'task-comment.create',
350
- READ: 'task-comment.read',
351
- DELETE: 'task-comment.delete'
352
- };
353
- // ==================== AI ASSISTANT MODULE ====================
354
- const AI_ASSISTANT_PERMISSIONS = {
355
- VIEW_ALL_HISTORY: 'ai-assistant.view-all-history'
356
- };
357
- // ==================== AGGREGATED EXPORTS ====================
358
- const PERMISSIONS = {
359
- // Auth
360
- USER: USER_PERMISSIONS,
361
- COMPANY: COMPANY_PERMISSIONS,
362
- BRANCH: BRANCH_PERMISSIONS,
363
- SOCIAL_AUTH_CONFIG: SOCIAL_AUTH_CONFIG_PERMISSIONS,
364
- // IAM
365
- ACTION: ACTION_PERMISSIONS,
366
- ROLE: ROLE_PERMISSIONS,
367
- ROLE_ACTION: ROLE_ACTION_PERMISSIONS,
368
- USER_ROLE: USER_ROLE_PERMISSIONS,
369
- USER_ACTION: USER_ACTION_PERMISSIONS,
370
- COMPANY_ACTION: COMPANY_ACTION_PERMISSIONS,
371
- // Storage
372
- FILE: FILE_PERMISSIONS,
373
- FOLDER: FOLDER_PERMISSIONS,
374
- STORAGE_CONFIG: STORAGE_CONFIG_PERMISSIONS,
375
- // Email
376
- EMAIL_CONFIG: EMAIL_CONFIG_PERMISSIONS,
377
- EMAIL_TEMPLATE: EMAIL_TEMPLATE_PERMISSIONS,
378
- // Form Builder
379
- FORM: FORM_PERMISSIONS,
380
- FORM_RESULT: FORM_RESULT_PERMISSIONS,
381
- // Entity Builder
382
- ENTITY_DEFINITION: ENTITY_DEFINITION_PERMISSIONS,
383
- FIELD_DEFINITION: FIELD_DEFINITION_PERMISSIONS,
384
- FLOW_DEFINITION: FLOW_DEFINITION_PERMISSIONS,
385
- ENTITY_BUILDER_ALL_DYNAMIC: ENTITY_BUILDER_ALL_DYNAMIC,
386
- // Event Manager
387
- EVENT: EVENT_PERMISSIONS,
388
- // Notification
389
- NOTIFICATION: NOTIFICATION_PERMISSIONS,
390
- // Localization
391
- LANGUAGE: LANGUAGE_PERMISSIONS,
392
- TRANSLATION_KEY: TRANSLATION_KEY_PERMISSIONS,
393
- TRANSLATION: TRANSLATION_PERMISSIONS,
394
- // Task Manager
395
- TASK_BOARD: TASK_BOARD_PERMISSIONS,
396
- TASK_LIST: TASK_LIST_PERMISSIONS,
397
- TASK: TASK_PERMISSIONS,
398
- TASK_LABEL: TASK_LABEL_PERMISSIONS,
399
- TASK_COMMENT: TASK_COMMENT_PERMISSIONS,
400
- // AI Assistant
401
- AI_ASSISTANT: AI_ASSISTANT_PERMISSIONS
402
- };
403
-
404
- __webpack_require__.d(__webpack_exports__, {
405
- }, {
406
- BC: USER_PERMISSIONS,
407
- Bz: AI_ASSISTANT_PERMISSIONS,
408
- DP: ENTITY_DEFINITION_PERMISSIONS,
409
- Em: STORAGE_CONFIG_PERMISSIONS,
410
- G0: ENTITY_BUILDER_ALL_DYNAMIC,
411
- GH: dynamicEntityPermissionParent,
412
- GT: FORM_RESULT_PERMISSIONS,
413
- Jj: PERMISSIONS,
414
- N3: TRANSLATION_KEY_PERMISSIONS,
415
- ON: TASK_LIST_PERMISSIONS,
416
- P0: ROLE_ACTION_PERMISSIONS,
417
- Q5: LANGUAGE_PERMISSIONS,
418
- S6: FILE_PERMISSIONS,
419
- T: TASK_PERMISSIONS,
420
- UB: UPLOAD_CONFIG_PERMISSIONS,
421
- UG: TASK_LABEL_PERMISSIONS,
422
- Ub: EVENT_PERMISSIONS,
423
- V0: EMAIL_CONFIG_PERMISSIONS,
424
- Wc: FORM_PERMISSIONS,
425
- Y3: TASK_BOARD_PERMISSIONS,
426
- Y7: ACTION_PERMISSIONS,
427
- _X: USER_ACTION_PERMISSIONS,
428
- aO: COMPANY_ACTION_PERMISSIONS,
429
- aT: dynamicEntityPermission,
430
- fS: TRANSLATION_PERMISSIONS,
431
- kA: FIELD_DEFINITION_PERMISSIONS,
432
- kd: FLOW_DEFINITION_PERMISSIONS,
433
- l3: SOCIAL_AUTH_CONFIG_PERMISSIONS,
434
- mV: ROLE_PERMISSIONS,
435
- rH: NOTIFICATION_PERMISSIONS,
436
- t$: COMPANY_PERMISSIONS,
437
- w7: USER_ROLE_PERMISSIONS,
438
- wA: BRANCH_PERMISSIONS,
439
- wM: FOLDER_PERMISSIONS,
440
- z$: EMAIL_TEMPLATE_PERMISSIONS,
441
- zd: TASK_COMMENT_PERMISSIONS
442
- });
443
-
444
-
445
- },
446
- 374(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
447
- /* import */ var _nestjs_common__rspack_import_0 = __webpack_require__(157);
448
- /* import */ var _constants_message_keys_js__rspack_import_1 = __webpack_require__(389);
6
+ 8374(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
7
+ /* import */ var _nestjs_common__rspack_import_0 = __webpack_require__(6157);
8
+ /* import */ var _constants_message_keys_js__rspack_import_1 = __webpack_require__(4389);
449
9
 
450
10
 
451
11
  class PermissionSystemUnavailableException extends _nestjs_common__rspack_import_0.InternalServerErrorException {
@@ -490,7 +50,7 @@ __webpack_require__.d(__webpack_exports__, {
490
50
 
491
51
 
492
52
  },
493
- 154(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
53
+ 8154(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
494
54
  /**
495
55
  * The tenant a cache key belongs to: the provider's current tenant in multi-tenant mode, else
496
56
  * undefined. A single database never prefixes, so a stray tenant header cannot split its cache.
@@ -505,7 +65,7 @@ __webpack_require__.d(__webpack_exports__, {
505
65
 
506
66
 
507
67
  },
508
- 456(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
68
+ 8456(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
509
69
  const SENSITIVE_KEYS = [
510
70
  'password',
511
71
  'secret',
@@ -543,25 +103,27 @@ const MAX_DEPTH = 8;
543
103
  * `*` matches exactly one segment, `#` and `**` match zero or more segments.
544
104
  */ function matchEventPattern(pattern, eventName) {
545
105
  if (pattern === eventName) return true;
546
- const patternSegments = pattern.split('.');
547
- const nameSegments = eventName.split('.');
548
- return matchSegments(patternSegments, 0, nameSegments, 0);
106
+ return matchSegments(pattern.split('.'), eventName.split('.'));
549
107
  }
550
108
  function isMultiWildcard(segment) {
551
109
  return segment === '#' || segment === '**';
552
110
  }
553
- function matchSegments(pattern, patternIndex, name, nameIndex) {
554
- if (patternIndex === pattern.length) return nameIndex === name.length;
555
- const segment = pattern[patternIndex];
556
- if (isMultiWildcard(segment)) {
557
- for(let skip = nameIndex; skip <= name.length; skip++){
558
- if (matchSegments(pattern, patternIndex + 1, name, skip)) return true;
111
+ /** Linear in pattern x name length: each (pattern, name) position is decided once, however many `#` there are. */ function matchSegments(pattern, name) {
112
+ let matches = new Array(name.length + 1).fill(false);
113
+ matches[name.length] = true;
114
+ for(let p = pattern.length - 1; p >= 0; p--){
115
+ const segment = pattern[p];
116
+ const next = new Array(name.length + 1).fill(false);
117
+ for(let n = name.length; n >= 0; n--){
118
+ if (isMultiWildcard(segment)) {
119
+ next[n] = matches[n] || n < name.length && next[n + 1];
120
+ } else {
121
+ next[n] = n < name.length && (segment === '*' || segment === name[n]) && matches[n + 1];
122
+ }
559
123
  }
560
- return false;
124
+ matches = next;
561
125
  }
562
- if (nameIndex === name.length) return false;
563
- if (segment !== '*' && segment !== name[nameIndex]) return false;
564
- return matchSegments(pattern, patternIndex + 1, name, nameIndex + 1);
126
+ return matches[0];
565
127
  }
566
128
  /**
567
129
  * Strips credential-like fields before a row leaves the process on an event.
@@ -592,13 +154,14 @@ function sanitizeValue(value, ancestors, depth) {
592
154
  ancestors.delete(value);
593
155
  }
594
156
  }
595
- function isSensitiveKey(key) {
596
- const lowered = key.toLowerCase();
597
- if (SENSITIVE_EXACT_KEYS.includes(lowered)) return true;
598
- return SENSITIVE_KEYS.some((sensitive)=>lowered.includes(sensitive));
157
+ /** Case and separator blind, so `apiKey`, `api_key`, `X-API-KEY` and `private-key` all match. */ function isSensitiveKey(key) {
158
+ const normalized = key.toLowerCase().replace(/[\s_.-]/g, '');
159
+ if (SENSITIVE_EXACT_KEYS.includes(normalized)) return true;
160
+ return SENSITIVE_KEYS.some((sensitive)=>normalized.includes(sensitive));
599
161
  }
600
162
 
601
163
  __webpack_require__.d(__webpack_exports__, {
164
+ Gd: () => (isSensitiveKey),
602
165
  IN: () => (sanitizeEventPayload),
603
166
  _c: () => (isMultiWildcard),
604
167
  qe: () => (matchEventPattern)
@@ -606,8 +169,10 @@ __webpack_require__.d(__webpack_exports__, {
606
169
 
607
170
 
608
171
  },
609
- 199(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
610
- /* import */ var _constants_index_js__rspack_import_0 = __webpack_require__(43);
172
+ 3199(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
173
+ /* import */ var _constants_index_js__rspack_import_0 = __webpack_require__(6043);
174
+ /* import */ var _middlewares_logger_middleware_js__rspack_import_1 = __webpack_require__(8244);
175
+
611
176
 
612
177
  const DEFAULT_USER_PERMISSION_KEY_FORMAT = `${_constants_index_js__rspack_import_0/* .PERMISSIONS_CACHE_PREFIX */.fG}:user:{userId}`;
613
178
  const DEFAULT_COMPANY_PERMISSION_KEY_FORMAT = `${_constants_index_js__rspack_import_0/* .PERMISSIONS_CACHE_PREFIX */.fG}:company:{companyId}:branch:{branchId}:user:{userId}`;
@@ -618,9 +183,31 @@ const DEFAULT_COMPANY_PERMISSION_KEY_FORMAT = `${_constants_index_js__rspack_imp
618
183
  }
619
184
  return (config?.userPermissionKeyFormat || DEFAULT_USER_PERMISSION_KEY_FORMAT).replace('{userId}', options.userId);
620
185
  }
186
+ /**
187
+ * Tenant databases can share user ids (they are cloned from one template), so multi-tenant keys
188
+ * carry the request's tenant. A single database never does: a stray tenant header must not move
189
+ * a user onto a cache entry that invalidation never reaches.
190
+ */ function permissionTenant(config) {
191
+ return config?.multiTenant ? `tenant:${(0,_middlewares_logger_middleware_js__rspack_import_1/* .getTenantId */.EO)() ?? 'none'}:` : '';
192
+ }
193
+ function permissionStampName(userId, config) {
194
+ return `${_constants_index_js__rspack_import_0/* .PERMISSIONS_CACHE_PREFIX */.fG}:${permissionTenant(config)}user:${userId}`;
195
+ }
196
+ /**
197
+ * The key a user's permissions are cached under right now: tenant + scope + the user's version
198
+ * stamp. Resolve it once, BEFORE reading grants from the database, and write under that same key.
199
+ */ async function resolvePermissionCacheKey(cache, options, config) {
200
+ const stamp = await cache.getStamp(permissionStampName(options.userId, config));
201
+ return `${permissionTenant(config)}${buildPermissionCacheKey(options, config)}:v:${stamp}`;
202
+ }
203
+ /** Drops every cached permission scope (each company and branch) of the user, on every instance */ async function invalidatePermissionCache(cache, userId, config) {
204
+ await cache.bumpStamp(permissionStampName(userId, config));
205
+ }
621
206
 
622
207
  __webpack_require__.d(__webpack_exports__, {
623
- nt: () => (buildPermissionCacheKey)
208
+ Rw: () => (resolvePermissionCacheKey),
209
+ nt: () => (buildPermissionCacheKey),
210
+ xp: () => (invalidatePermissionCache)
624
211
  }, {
625
212
  q6: DEFAULT_USER_PERMISSION_KEY_FORMAT,
626
213
  s8: DEFAULT_COMPANY_PERMISSION_KEY_FORMAT
@@ -629,7 +216,7 @@ __webpack_require__.d(__webpack_exports__, {
629
216
 
630
217
  },
631
218
  788(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
632
- /* import */ var _exceptions_permission_exception_js__rspack_import_0 = __webpack_require__(374);
219
+ /* import */ var _exceptions_permission_exception_js__rspack_import_0 = __webpack_require__(8374);
633
220
 
634
221
  /** Whether `granted` covers `required`, honoring `*` (everything) and `prefix.*` (everything under prefix) wildcards */ function matchesPermission(granted, required) {
635
222
  if (granted.includes(required)) return true;
@@ -710,21 +297,89 @@ __webpack_require__.d(__webpack_exports__, {
710
297
 
711
298
 
712
299
  },
713
- 307(module) {
300
+ 3366(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
301
+ /**
302
+ * URL-friendly slug: lower case, words joined by single hyphens. Latin accents are folded
303
+ * (`Café` -> `cafe`) and letters of other scripts are kept, so a non-Latin name never
304
+ * collapses to an empty slug. Never starts or ends with a hyphen, also after truncation.
305
+ *
306
+ * @example
307
+ * generateSlug('My Company Name') // 'my-company-name'
308
+ * generateSlug('Hello World!') // 'hello-world'
309
+ */ function generateSlug(text, maxLength = 100) {
310
+ const slug = text.normalize('NFKD').toLowerCase().replace(/([a-z0-9])\p{M}+/gu, '$1').replace(/[^\p{L}\p{N}\p{M}\s-]/gu, '').trim().replace(/[\s-]+/g, '-').replace(/^-+|-+$/g, '').normalize('NFC');
311
+ return Array.from(slug).slice(0, Math.max(maxLength, 0)).join('').replace(/-+$/, '');
312
+ }
313
+ /**
314
+ * Generate unique slug using single database query (optimized for large datasets)
315
+ * Appends numeric suffix if collision exists (e.g., 'my-company-1', 'my-company-2')
316
+ *
317
+ * Performance: O(1) database query regardless of collision count
318
+ * - Works efficiently with millions of records
319
+ * - Requires index on slug column for best performance
320
+ *
321
+ * @param text - The text to convert to slug
322
+ * @param findMatchingSlugs - Async function that returns all slugs matching base pattern
323
+ * Should query: WHERE slug = baseSlug OR slug LIKE 'baseSlug-%'
324
+ * @param maxLength - Maximum length of the base slug (default: 100)
325
+ * @returns Unique URL-friendly slug
326
+ *
327
+ * @example
328
+ * const slug = await generateUniqueSlug('My Company', async (baseSlug) => {
329
+ * return repo
330
+ * .createQueryBuilder('c')
331
+ * .select('c.slug')
332
+ * .where('c.slug = :base OR c.slug LIKE :pattern', {
333
+ * base: baseSlug,
334
+ * pattern: `${baseSlug}-%`,
335
+ * })
336
+ * .getMany()
337
+ * .then(rows => rows.map(r => r.slug));
338
+ * });
339
+ */ async function generateUniqueSlug(text, findMatchingSlugs, maxLength = 100) {
340
+ const baseSlug = generateSlug(text, maxLength);
341
+ // Single query to get all matching slugs
342
+ const existingSlugs = await findMatchingSlugs(baseSlug);
343
+ // No collisions - base slug is available
344
+ if (existingSlugs.length === 0) {
345
+ return baseSlug;
346
+ }
347
+ // Build set for O(1) lookup
348
+ const existingSet = new Set(existingSlugs);
349
+ // Base slug not taken (only suffixed versions exist)
350
+ if (!existingSet.has(baseSlug)) {
351
+ return baseSlug;
352
+ }
353
+ // Find next available suffix in memory (fast)
354
+ let counter = 1;
355
+ while(counter < 10000){
356
+ const slugWithSuffix = `${baseSlug}-${counter}`;
357
+ if (!existingSet.has(slugWithSuffix)) {
358
+ return slugWithSuffix;
359
+ }
360
+ counter++;
361
+ }
362
+ // Fallback: append random string (extremely rare edge case)
363
+ const randomSuffix = Math.random().toString(36).substring(2, 8);
364
+ return `${baseSlug}-${randomSuffix}`;
365
+ }
714
366
 
715
- module.exports = __rspack_external__flusys_nestjs_core_config_197fa0a9;
367
+ __webpack_require__.d(__webpack_exports__, {
368
+ o: () => (generateUniqueSlug),
369
+ z: () => (generateSlug)
370
+ });
716
371
 
717
372
 
718
373
  },
719
- 157(module) {
374
+ 7823(module) {
720
375
 
721
- module.exports = __rspack_external__nestjs_common_a04939da;
376
+ module.exports = __rspack_external_crypto;
722
377
 
723
378
 
724
379
  },
725
- 823(module) {
380
+ 7158(module) {
726
381
 
727
- module.exports = __rspack_external_crypto;
382
+ module.exports = __rspack_external_typeorm;
728
383
 
729
384
 
730
385
  },
@@ -732,11 +387,13 @@ module.exports = __rspack_external_crypto;
732
387
  };
733
388
  import { __webpack_require__ } from '../runtime.js';
734
389
  var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
735
- import * as __rspack_chunk_1 from '../282.js';
390
+ import * as __rspack_chunk_1 from '../997.js';
736
391
  __webpack_require__.C(__rspack_chunk_1);
737
- import * as __rspack_chunk_2 from './index.js';
392
+ import * as __rspack_chunk_2 from '../47.js';
738
393
  __webpack_require__.C(__rspack_chunk_2);
739
- var __webpack_exports__ = __webpack_exec__(129);var __webpack_exports__DEFAULT_COMPANY_PERMISSION_KEY_FORMAT = __webpack_exports__.s8;
394
+ import * as __rspack_chunk_3 from './index.js';
395
+ __webpack_require__.C(__rspack_chunk_3);
396
+ var __webpack_exports__ = __webpack_exec__(4578);var __webpack_exports__DEFAULT_COMPANY_PERMISSION_KEY_FORMAT = __webpack_exports__.s8;
740
397
  var __webpack_exports__DEFAULT_USER_PERMISSION_KEY_FORMAT = __webpack_exports__.q6;
741
398
  var __webpack_exports__EXPRESSION_FUNCTIONS = __webpack_exports__.Dd;
742
399
  var __webpack_exports__EXPRESSION_LIMITS = __webpack_exports__.wj;
@@ -769,14 +426,15 @@ var __webpack_exports__generateSecureToken = __webpack_exports__.sN;
769
426
  var __webpack_exports__generateSlug = __webpack_exports__.z9;
770
427
  var __webpack_exports__generateUniqueSlug = __webpack_exports__.oo;
771
428
  var __webpack_exports__getBranchPath = __webpack_exports__.gN;
772
- var __webpack_exports__getTodayInTimezone = __webpack_exports__.oB;
773
429
  var __webpack_exports__hasCompanyId = __webpack_exports__.f;
774
430
  var __webpack_exports__hashToken = __webpack_exports__.QK;
431
+ var __webpack_exports__invalidatePermissionCache = __webpack_exports__.xp;
775
432
  var __webpack_exports__isBranchWithin = __webpack_exports__.QU;
776
433
  var __webpack_exports__isBrowserRequest = __webpack_exports__.wh;
777
434
  var __webpack_exports__isExpired = __webpack_exports__._d;
778
435
  var __webpack_exports__isExpressionError = __webpack_exports__.tX;
779
436
  var __webpack_exports__isMultiWildcard = __webpack_exports__._c;
437
+ var __webpack_exports__isSensitiveKey = __webpack_exports__.Gd;
780
438
  var __webpack_exports__loadOptionalModule = __webpack_exports__.lk;
781
439
  var __webpack_exports__loadPermissionCodes = __webpack_exports__.CQ;
782
440
  var __webpack_exports__localToUtc = __webpack_exports__.vf;
@@ -787,9 +445,10 @@ var __webpack_exports__normalizeBranchIds = __webpack_exports__.Ty;
787
445
  var __webpack_exports__parseDurationToMs = __webpack_exports__.Ju;
788
446
  var __webpack_exports__permissionLogicCodes = __webpack_exports__.MO;
789
447
  var __webpack_exports__permissionLogicProblem = __webpack_exports__.HU;
448
+ var __webpack_exports__resolvePermissionCacheKey = __webpack_exports__.Rw;
790
449
  var __webpack_exports__safeRegexProblem = __webpack_exports__._X;
791
450
  var __webpack_exports__sanitizeEventPayload = __webpack_exports__.IN;
792
451
  var __webpack_exports__utcToLocal = __webpack_exports__.v4;
793
452
  var __webpack_exports__validateCompanyOwnership = __webpack_exports__.bE;
794
453
  var __webpack_exports__withSavepoint = __webpack_exports__.o0;
795
- export { __webpack_exports__DEFAULT_COMPANY_PERMISSION_KEY_FORMAT as DEFAULT_COMPANY_PERMISSION_KEY_FORMAT, __webpack_exports__DEFAULT_USER_PERMISSION_KEY_FORMAT as DEFAULT_USER_PERMISSION_KEY_FORMAT, __webpack_exports__EXPRESSION_FUNCTIONS as EXPRESSION_FUNCTIONS, __webpack_exports__EXPRESSION_LIMITS as EXPRESSION_LIMITS, __webpack_exports__ExpressionError as ExpressionError, __webpack_exports__MAX_PERMISSION_LOGIC_CODES as MAX_PERMISSION_LOGIC_CODES, __webpack_exports__MAX_PERMISSION_LOGIC_DEPTH as MAX_PERMISSION_LOGIC_DEPTH, __webpack_exports__SAFE_REGEX_LIMITS as SAFE_REGEX_LIMITS, __webpack_exports__applyBranchFilter as applyBranchFilter, __webpack_exports__applyCompanyFilter as applyCompanyFilter, __webpack_exports__assertValidConditionGroup as assertValidConditionGroup, __webpack_exports__assertValidExpression as assertValidExpression, __webpack_exports__buildCompanyWhereCondition as buildCompanyWhereCondition, __webpack_exports__buildCookieOptions as buildCookieOptions, __webpack_exports__buildFrontendUrl as buildFrontendUrl, __webpack_exports__buildPermissionCacheKey as buildPermissionCacheKey, __webpack_exports__cacheTenantId as cacheTenantId, __webpack_exports__collectBranchAncestorIds as collectBranchAncestorIds, __webpack_exports__collectBranchDescendantIds as collectBranchDescendantIds, __webpack_exports__compileSafeRegex as compileSafeRegex, __webpack_exports__escapeHtml as escapeHtml, __webpack_exports__escapeHtmlVariables as escapeHtmlVariables, __webpack_exports__evaluateConditionGroup as evaluateConditionGroup, __webpack_exports__evaluateExpression as evaluateExpression, __webpack_exports__evaluatePermissionLogic as evaluatePermissionLogic, __webpack_exports__expressionToNumber as expressionToNumber, __webpack_exports__expressionToText as expressionToText, __webpack_exports__extractFrontendUrl as extractFrontendUrl, __webpack_exports__formatInTimezone as formatInTimezone, __webpack_exports__generateSecureToken as generateSecureToken, __webpack_exports__generateSlug as generateSlug, __webpack_exports__generateUniqueSlug as generateUniqueSlug, __webpack_exports__getBranchPath as getBranchPath, __webpack_exports__getTodayInTimezone as getTodayInTimezone, __webpack_exports__hasCompanyId as hasCompanyId, __webpack_exports__hashToken as hashToken, __webpack_exports__isBranchWithin as isBranchWithin, __webpack_exports__isBrowserRequest as isBrowserRequest, __webpack_exports__isExpired as isExpired, __webpack_exports__isExpressionError as isExpressionError, __webpack_exports__isMultiWildcard as isMultiWildcard, __webpack_exports__loadOptionalModule as loadOptionalModule, __webpack_exports__loadPermissionCodes as loadPermissionCodes, __webpack_exports__localToUtc as localToUtc, __webpack_exports__matchEventPattern as matchEventPattern, __webpack_exports__matchesPermission as matchesPermission, __webpack_exports__messageRef as messageRef, __webpack_exports__normalizeBranchIds as normalizeBranchIds, __webpack_exports__parseDurationToMs as parseDurationToMs, __webpack_exports__permissionLogicCodes as permissionLogicCodes, __webpack_exports__permissionLogicProblem as permissionLogicProblem, __webpack_exports__safeRegexProblem as safeRegexProblem, __webpack_exports__sanitizeEventPayload as sanitizeEventPayload, __webpack_exports__utcToLocal as utcToLocal, __webpack_exports__validateCompanyOwnership as validateCompanyOwnership, __webpack_exports__withSavepoint as withSavepoint };
454
+ export { __webpack_exports__DEFAULT_COMPANY_PERMISSION_KEY_FORMAT as DEFAULT_COMPANY_PERMISSION_KEY_FORMAT, __webpack_exports__DEFAULT_USER_PERMISSION_KEY_FORMAT as DEFAULT_USER_PERMISSION_KEY_FORMAT, __webpack_exports__EXPRESSION_FUNCTIONS as EXPRESSION_FUNCTIONS, __webpack_exports__EXPRESSION_LIMITS as EXPRESSION_LIMITS, __webpack_exports__ExpressionError as ExpressionError, __webpack_exports__MAX_PERMISSION_LOGIC_CODES as MAX_PERMISSION_LOGIC_CODES, __webpack_exports__MAX_PERMISSION_LOGIC_DEPTH as MAX_PERMISSION_LOGIC_DEPTH, __webpack_exports__SAFE_REGEX_LIMITS as SAFE_REGEX_LIMITS, __webpack_exports__applyBranchFilter as applyBranchFilter, __webpack_exports__applyCompanyFilter as applyCompanyFilter, __webpack_exports__assertValidConditionGroup as assertValidConditionGroup, __webpack_exports__assertValidExpression as assertValidExpression, __webpack_exports__buildCompanyWhereCondition as buildCompanyWhereCondition, __webpack_exports__buildCookieOptions as buildCookieOptions, __webpack_exports__buildFrontendUrl as buildFrontendUrl, __webpack_exports__buildPermissionCacheKey as buildPermissionCacheKey, __webpack_exports__cacheTenantId as cacheTenantId, __webpack_exports__collectBranchAncestorIds as collectBranchAncestorIds, __webpack_exports__collectBranchDescendantIds as collectBranchDescendantIds, __webpack_exports__compileSafeRegex as compileSafeRegex, __webpack_exports__escapeHtml as escapeHtml, __webpack_exports__escapeHtmlVariables as escapeHtmlVariables, __webpack_exports__evaluateConditionGroup as evaluateConditionGroup, __webpack_exports__evaluateExpression as evaluateExpression, __webpack_exports__evaluatePermissionLogic as evaluatePermissionLogic, __webpack_exports__expressionToNumber as expressionToNumber, __webpack_exports__expressionToText as expressionToText, __webpack_exports__extractFrontendUrl as extractFrontendUrl, __webpack_exports__formatInTimezone as formatInTimezone, __webpack_exports__generateSecureToken as generateSecureToken, __webpack_exports__generateSlug as generateSlug, __webpack_exports__generateUniqueSlug as generateUniqueSlug, __webpack_exports__getBranchPath as getBranchPath, __webpack_exports__hasCompanyId as hasCompanyId, __webpack_exports__hashToken as hashToken, __webpack_exports__invalidatePermissionCache as invalidatePermissionCache, __webpack_exports__isBranchWithin as isBranchWithin, __webpack_exports__isBrowserRequest as isBrowserRequest, __webpack_exports__isExpired as isExpired, __webpack_exports__isExpressionError as isExpressionError, __webpack_exports__isMultiWildcard as isMultiWildcard, __webpack_exports__isSensitiveKey as isSensitiveKey, __webpack_exports__loadOptionalModule as loadOptionalModule, __webpack_exports__loadPermissionCodes as loadPermissionCodes, __webpack_exports__localToUtc as localToUtc, __webpack_exports__matchEventPattern as matchEventPattern, __webpack_exports__matchesPermission as matchesPermission, __webpack_exports__messageRef as messageRef, __webpack_exports__normalizeBranchIds as normalizeBranchIds, __webpack_exports__parseDurationToMs as parseDurationToMs, __webpack_exports__permissionLogicCodes as permissionLogicCodes, __webpack_exports__permissionLogicProblem as permissionLogicProblem, __webpack_exports__resolvePermissionCacheKey as resolvePermissionCacheKey, __webpack_exports__safeRegexProblem as safeRegexProblem, __webpack_exports__sanitizeEventPayload as sanitizeEventPayload, __webpack_exports__utcToLocal as utcToLocal, __webpack_exports__validateCompanyOwnership as validateCompanyOwnership, __webpack_exports__withSavepoint as withSavepoint };