roles-privileges-payload-plugin 1.1.2 → 1.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 (47) hide show
  1. package/README.md +15 -0
  2. package/dist/collections/roles.d.ts +2 -2
  3. package/dist/collections/roles.js +27 -45
  4. package/dist/collections/roles.js.map +1 -1
  5. package/dist/components/PrivilegesSelect.d.ts +3 -3
  6. package/dist/components/PrivilegesSelect.js +89 -71
  7. package/dist/components/PrivilegesSelect.js.map +1 -1
  8. package/dist/exports/utilities.d.ts +5 -4
  9. package/dist/exports/utilities.js +10 -8
  10. package/dist/exports/utilities.js.map +1 -1
  11. package/dist/fields/slug/SlugComponent.d.ts +9 -0
  12. package/dist/fields/slug/SlugComponent.js +83 -0
  13. package/dist/fields/slug/SlugComponent.js.map +1 -0
  14. package/dist/fields/slug/formatSlug.d.ts +3 -0
  15. package/dist/fields/slug/formatSlug.js +15 -0
  16. package/dist/fields/slug/formatSlug.js.map +1 -0
  17. package/dist/fields/slug/index.d.ts +8 -0
  18. package/dist/fields/slug/index.js +47 -0
  19. package/dist/fields/slug/index.js.map +1 -0
  20. package/dist/fields/slug/index.scss +12 -0
  21. package/dist/index.d.ts +17 -7
  22. package/dist/index.js +59 -10
  23. package/dist/index.js.map +1 -1
  24. package/dist/roles-privileges-payload-plugin-1.2.0.tgz +0 -0
  25. package/dist/translations/index.js +4 -4
  26. package/dist/translations/index.js.map +1 -1
  27. package/dist/translations/languages/en.js +19 -18
  28. package/dist/translations/languages/en.js.map +1 -1
  29. package/dist/translations/languages/fr.js +19 -18
  30. package/dist/translations/languages/fr.js.map +1 -1
  31. package/dist/translations/types.d.ts +43 -42
  32. package/dist/translations/types.js.map +1 -1
  33. package/dist/utils/assignSuperAdminToFirstUser.d.ts +10 -0
  34. package/dist/utils/assignSuperAdminToFirstUser.js +70 -0
  35. package/dist/utils/assignSuperAdminToFirstUser.js.map +1 -0
  36. package/dist/utils/createCustomPrivilege.d.ts +9 -9
  37. package/dist/utils/createCustomPrivilege.js +4 -4
  38. package/dist/utils/createCustomPrivilege.js.map +1 -1
  39. package/dist/utils/generateGlobalPrivileges.d.ts +4 -4
  40. package/dist/utils/generateGlobalPrivileges.js +4 -4
  41. package/dist/utils/generateGlobalPrivileges.js.map +1 -1
  42. package/dist/utils/generatePrivileges.d.ts +6 -6
  43. package/dist/utils/generatePrivileges.js +6 -6
  44. package/dist/utils/generatePrivileges.js.map +1 -1
  45. package/dist/utils/seedSuperAdminRole.js +7 -7
  46. package/dist/utils/seedSuperAdminRole.js.map +1 -1
  47. package/package.json +1 -1
@@ -10,10 +10,10 @@ import { memo, useCallback } from 'react';
10
10
  * @param {CollectionPrivileges[]} props.collections - Collections with their privileges
11
11
  * @param {GlobalPrivileges[]} props.globals - Globals with their privileges
12
12
  */ const PrivilegesSelect = (props)=>{
13
- const { path, collections = [], globals = [] } = props;
13
+ const { collections = [], globals = [], path } = props;
14
14
  const { rows } = useField({
15
- path,
16
- hasRows: true
15
+ hasRows: true,
16
+ path
17
17
  });
18
18
  const { addFieldRow, removeFieldRow, setModified } = useForm();
19
19
  const { dispatch } = useFormFields(([_, dispatch])=>({
@@ -22,9 +22,11 @@ import { memo, useCallback } from 'react';
22
22
  const { i18n } = useTranslation();
23
23
  const locale = i18n?.language || 'en';
24
24
  // Helper to get label in current locale with fallback
25
- const getLabel = (labels)=>{
25
+ const getLabel = useCallback((labels)=>{
26
26
  return labels[locale] || labels._default || labels.en || Object.values(labels)[0] || '';
27
- };
27
+ }, [
28
+ locale
29
+ ]);
28
30
  // Use the collections and globals from props
29
31
  const collectionsArray = collections;
30
32
  const globalsArray = globals;
@@ -57,7 +59,7 @@ import { memo, useCallback } from 'react';
57
59
  }, [
58
60
  collectionsArray,
59
61
  globalsArray,
60
- locale
62
+ getLabel
61
63
  ]);
62
64
  /**
63
65
  * Check if a privilege is already selected
@@ -104,8 +106,8 @@ import { memo, useCallback } from 'react';
104
106
  ]);
105
107
  return /*#__PURE__*/ _jsxs("div", {
106
108
  style: {
107
- marginTop: '16px',
108
- marginBottom: '16px'
109
+ marginBottom: '16px',
110
+ marginTop: '16px'
109
111
  },
110
112
  children: [
111
113
  /*#__PURE__*/ _jsxs("div", {
@@ -121,20 +123,22 @@ import { memo, useCallback } from 'react';
121
123
  return /*#__PURE__*/ _jsx(Collapsible, {
122
124
  header: /*#__PURE__*/ _jsxs("div", {
123
125
  style: {
124
- display: 'flex',
125
126
  alignItems: 'center',
127
+ display: 'flex',
126
128
  justifyContent: 'space-between',
127
129
  width: '100%'
128
130
  },
129
131
  children: [
130
132
  /*#__PURE__*/ _jsxs("div", {
131
133
  style: {
132
- display: 'flex',
133
134
  alignItems: 'center',
135
+ display: 'flex',
134
136
  gap: '8px'
135
137
  },
136
138
  children: [
137
139
  /*#__PURE__*/ _jsx("span", {
140
+ "aria-label": "Collection",
141
+ role: "img",
138
142
  children: "📦"
139
143
  }),
140
144
  /*#__PURE__*/ _jsx("span", {
@@ -147,12 +151,12 @@ import { memo, useCallback } from 'react';
147
151
  }),
148
152
  selectedCount > 0 && /*#__PURE__*/ _jsx("span", {
149
153
  style: {
150
- padding: '2px 8px',
151
154
  backgroundColor: 'var(--theme-success-100)',
152
- color: 'var(--theme-success-800)',
153
155
  borderRadius: '12px',
156
+ color: 'var(--theme-success-800)',
154
157
  fontSize: '12px',
155
- fontWeight: 600
158
+ fontWeight: 600,
159
+ padding: '2px 8px'
156
160
  },
157
161
  children: selectedCount
158
162
  })
@@ -160,39 +164,43 @@ import { memo, useCallback } from 'react';
160
164
  }),
161
165
  children: /*#__PURE__*/ _jsx("div", {
162
166
  style: {
163
- padding: '16px',
164
167
  backgroundColor: 'var(--theme-elevation-50)',
165
168
  display: 'flex',
166
169
  flexDirection: 'column',
167
- gap: '12px'
170
+ gap: '12px',
171
+ padding: '16px'
168
172
  },
169
173
  children: privileges.map((privilege)=>{
170
174
  const isSelected = isPrivilegeSelected(privilege.privilegeKey);
171
175
  const isCustom = privilege.isCustom === true;
172
176
  return /*#__PURE__*/ _jsx("div", {
173
177
  style: {
174
- padding: '12px',
175
178
  backgroundColor: 'var(--theme-elevation-0)',
176
179
  border: `1px solid ${isSelected ? 'var(--theme-success-300)' : 'var(--theme-elevation-300)'}`,
177
180
  borderRadius: '4px',
181
+ padding: '12px',
178
182
  transition: 'all 0.2s'
179
183
  },
180
184
  children: /*#__PURE__*/ _jsxs("label", {
185
+ "aria-label": `Select privilege: ${getLabel(privilege.label)}`,
186
+ htmlFor: `global-privilege-${privilege.privilegeKey}`,
181
187
  style: {
182
- display: 'flex',
183
188
  alignItems: 'flex-start',
184
- gap: '12px',
185
- cursor: 'pointer'
189
+ cursor: 'pointer',
190
+ display: 'flex',
191
+ gap: '12px'
186
192
  },
187
193
  children: [
188
194
  /*#__PURE__*/ _jsx("input", {
189
- type: "checkbox",
195
+ "aria-label": `Select privilege: ${getLabel(privilege.label)}`,
190
196
  checked: isSelected,
197
+ id: `global-privilege-${privilege.privilegeKey}`,
191
198
  onChange: ()=>handlePrivilegeToggle(privilege),
192
199
  style: {
193
- marginTop: '2px',
194
- cursor: 'pointer'
195
- }
200
+ cursor: 'pointer',
201
+ marginTop: '2px'
202
+ },
203
+ type: "checkbox"
196
204
  }),
197
205
  /*#__PURE__*/ _jsxs("div", {
198
206
  style: {
@@ -201,16 +209,18 @@ import { memo, useCallback } from 'react';
201
209
  children: [
202
210
  /*#__PURE__*/ _jsxs("div", {
203
211
  style: {
204
- fontWeight: 600,
205
- fontSize: '14px',
212
+ alignItems: 'center',
206
213
  color: 'var(--theme-elevation-1000)',
207
- marginBottom: '4px',
208
214
  display: 'flex',
209
- alignItems: 'center',
210
- gap: '6px'
215
+ fontSize: '14px',
216
+ fontWeight: 600,
217
+ gap: '6px',
218
+ marginBottom: '4px'
211
219
  },
212
220
  children: [
213
221
  isCustom && /*#__PURE__*/ _jsx("span", {
222
+ "aria-label": "Custom privilege",
223
+ role: "img",
214
224
  style: {
215
225
  fontSize: '16px'
216
226
  },
@@ -221,8 +231,8 @@ import { memo, useCallback } from 'react';
221
231
  }),
222
232
  /*#__PURE__*/ _jsx("div", {
223
233
  style: {
224
- fontSize: '13px',
225
234
  color: 'var(--theme-elevation-700)',
235
+ fontSize: '13px',
226
236
  lineHeight: '1.4',
227
237
  marginBottom: '8px'
228
238
  },
@@ -230,13 +240,13 @@ import { memo, useCallback } from 'react';
230
240
  }),
231
241
  /*#__PURE__*/ _jsxs("div", {
232
242
  style: {
233
- padding: '4px 8px',
234
243
  backgroundColor: isCustom ? 'var(--theme-warning-100)' : 'var(--theme-elevation-100)',
235
244
  borderRadius: '4px',
236
- fontSize: '11px',
237
- fontFamily: 'monospace',
238
245
  color: isCustom ? 'var(--theme-warning-900)' : 'var(--theme-elevation-800)',
239
- display: 'inline-block'
246
+ display: 'inline-block',
247
+ fontFamily: 'monospace',
248
+ fontSize: '11px',
249
+ padding: '4px 8px'
240
250
  },
241
251
  children: [
242
252
  isCustom && '⭐ ',
@@ -258,20 +268,22 @@ import { memo, useCallback } from 'react';
258
268
  return /*#__PURE__*/ _jsx(Collapsible, {
259
269
  header: /*#__PURE__*/ _jsxs("div", {
260
270
  style: {
261
- display: 'flex',
262
271
  alignItems: 'center',
272
+ display: 'flex',
263
273
  justifyContent: 'space-between',
264
274
  width: '100%'
265
275
  },
266
276
  children: [
267
277
  /*#__PURE__*/ _jsxs("div", {
268
278
  style: {
269
- display: 'flex',
270
279
  alignItems: 'center',
280
+ display: 'flex',
271
281
  gap: '8px'
272
282
  },
273
283
  children: [
274
284
  /*#__PURE__*/ _jsx("span", {
285
+ "aria-label": "Global",
286
+ role: "img",
275
287
  children: "🌐"
276
288
  }),
277
289
  /*#__PURE__*/ _jsx("span", {
@@ -284,12 +296,12 @@ import { memo, useCallback } from 'react';
284
296
  }),
285
297
  selectedCount > 0 && /*#__PURE__*/ _jsx("span", {
286
298
  style: {
287
- padding: '2px 8px',
288
299
  backgroundColor: 'var(--theme-success-100)',
289
- color: 'var(--theme-success-800)',
290
300
  borderRadius: '12px',
301
+ color: 'var(--theme-success-800)',
291
302
  fontSize: '12px',
292
- fontWeight: 600
303
+ fontWeight: 600,
304
+ padding: '2px 8px'
293
305
  },
294
306
  children: selectedCount
295
307
  })
@@ -297,39 +309,43 @@ import { memo, useCallback } from 'react';
297
309
  }),
298
310
  children: /*#__PURE__*/ _jsx("div", {
299
311
  style: {
300
- padding: '16px',
301
312
  backgroundColor: 'var(--theme-elevation-50)',
302
313
  display: 'flex',
303
314
  flexDirection: 'column',
304
- gap: '12px'
315
+ gap: '12px',
316
+ padding: '16px'
305
317
  },
306
318
  children: privileges.map((privilege)=>{
307
319
  const isSelected = isPrivilegeSelected(privilege.privilegeKey);
308
320
  const isCustom = privilege.isCustom === true;
309
321
  return /*#__PURE__*/ _jsx("div", {
310
322
  style: {
311
- padding: '12px',
312
323
  backgroundColor: 'var(--theme-elevation-0)',
313
324
  border: `1px solid ${isSelected ? 'var(--theme-success-300)' : 'var(--theme-elevation-300)'}`,
314
325
  borderRadius: '4px',
326
+ padding: '12px',
315
327
  transition: 'all 0.2s'
316
328
  },
317
329
  children: /*#__PURE__*/ _jsxs("label", {
330
+ "aria-label": `Select privilege: ${getLabel(privilege.label)}`,
331
+ htmlFor: `global-privilege-${privilege.privilegeKey}`,
318
332
  style: {
319
- display: 'flex',
320
333
  alignItems: 'flex-start',
321
- gap: '12px',
322
- cursor: 'pointer'
334
+ cursor: 'pointer',
335
+ display: 'flex',
336
+ gap: '12px'
323
337
  },
324
338
  children: [
325
339
  /*#__PURE__*/ _jsx("input", {
326
- type: "checkbox",
340
+ "aria-label": `Select privilege: ${getLabel(privilege.label)}`,
327
341
  checked: isSelected,
342
+ id: `global-privilege-${privilege.privilegeKey}`,
328
343
  onChange: ()=>handlePrivilegeToggle(privilege),
329
344
  style: {
330
- marginTop: '2px',
331
- cursor: 'pointer'
332
- }
345
+ cursor: 'pointer',
346
+ marginTop: '2px'
347
+ },
348
+ type: "checkbox"
333
349
  }),
334
350
  /*#__PURE__*/ _jsxs("div", {
335
351
  style: {
@@ -338,16 +354,18 @@ import { memo, useCallback } from 'react';
338
354
  children: [
339
355
  /*#__PURE__*/ _jsxs("div", {
340
356
  style: {
341
- fontWeight: 600,
342
- fontSize: '14px',
357
+ alignItems: 'center',
343
358
  color: 'var(--theme-elevation-1000)',
344
- marginBottom: '4px',
345
359
  display: 'flex',
346
- alignItems: 'center',
347
- gap: '6px'
360
+ fontSize: '14px',
361
+ fontWeight: 600,
362
+ gap: '6px',
363
+ marginBottom: '4px'
348
364
  },
349
365
  children: [
350
366
  isCustom && /*#__PURE__*/ _jsx("span", {
367
+ "aria-label": "Custom privilege",
368
+ role: "img",
351
369
  style: {
352
370
  fontSize: '16px'
353
371
  },
@@ -358,8 +376,8 @@ import { memo, useCallback } from 'react';
358
376
  }),
359
377
  /*#__PURE__*/ _jsx("div", {
360
378
  style: {
361
- fontSize: '13px',
362
379
  color: 'var(--theme-elevation-700)',
380
+ fontSize: '13px',
363
381
  lineHeight: '1.4',
364
382
  marginBottom: '8px'
365
383
  },
@@ -367,13 +385,13 @@ import { memo, useCallback } from 'react';
367
385
  }),
368
386
  /*#__PURE__*/ _jsxs("div", {
369
387
  style: {
370
- padding: '4px 8px',
371
388
  backgroundColor: isCustom ? 'var(--theme-warning-100)' : 'var(--theme-elevation-100)',
372
389
  borderRadius: '4px',
373
- fontSize: '11px',
374
- fontFamily: 'monospace',
375
390
  color: isCustom ? 'var(--theme-warning-900)' : 'var(--theme-elevation-800)',
376
- display: 'inline-block'
391
+ display: 'inline-block',
392
+ fontFamily: 'monospace',
393
+ fontSize: '11px',
394
+ padding: '4px 8px'
377
395
  },
378
396
  children: [
379
397
  isCustom && '⭐ ',
@@ -393,18 +411,18 @@ import { memo, useCallback } from 'react';
393
411
  }),
394
412
  existingPrivileges.length > 0 && /*#__PURE__*/ _jsxs("div", {
395
413
  style: {
396
- marginTop: '16px',
397
- padding: '16px',
398
414
  backgroundColor: 'var(--theme-elevation-100)',
399
- borderRadius: '4px'
415
+ borderRadius: '4px',
416
+ marginTop: '16px',
417
+ padding: '16px'
400
418
  },
401
419
  children: [
402
420
  /*#__PURE__*/ _jsxs("h5", {
403
421
  style: {
404
- margin: '0 0 12px 0',
422
+ color: 'var(--theme-elevation-1000)',
405
423
  fontSize: '14px',
406
424
  fontWeight: 600,
407
- color: 'var(--theme-elevation-1000)'
425
+ margin: '0 0 12px 0'
408
426
  },
409
427
  children: [
410
428
  i18n.t('plugin-roles-privileges:privileges-selected-count'),
@@ -422,22 +440,21 @@ import { memo, useCallback } from 'react';
422
440
  },
423
441
  children: existingPrivileges.map((privilegeKey, index)=>/*#__PURE__*/ _jsxs("div", {
424
442
  style: {
425
- display: 'inline-flex',
426
443
  alignItems: 'center',
427
- gap: '8px',
428
- padding: '6px 12px',
429
444
  backgroundColor: 'var(--theme-success-100)',
430
445
  border: '1px solid var(--theme-success-300)',
431
446
  borderRadius: '16px',
447
+ color: 'var(--theme-success-800)',
448
+ display: 'inline-flex',
432
449
  fontSize: '12px',
433
- color: 'var(--theme-success-800)'
450
+ gap: '8px',
451
+ padding: '6px 12px'
434
452
  },
435
453
  children: [
436
454
  /*#__PURE__*/ _jsx("span", {
437
455
  children: getPrivilegeLabel(privilegeKey)
438
456
  }),
439
457
  /*#__PURE__*/ _jsx("button", {
440
- type: "button",
441
458
  onClick: ()=>{
442
459
  removeFieldRow({
443
460
  path,
@@ -446,16 +463,17 @@ import { memo, useCallback } from 'react';
446
463
  setModified(true);
447
464
  },
448
465
  style: {
466
+ alignItems: 'center',
449
467
  background: 'none',
450
468
  border: 'none',
451
469
  color: 'var(--theme-success-600)',
452
470
  cursor: 'pointer',
453
- padding: 0,
454
471
  display: 'flex',
455
- alignItems: 'center',
456
472
  fontSize: '16px',
457
- lineHeight: 1
473
+ lineHeight: 1,
474
+ padding: 0
458
475
  },
476
+ type: "button",
459
477
  children: "×"
460
478
  })
461
479
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/PrivilegesSelect.tsx"],"sourcesContent":["'use client'\nimport type { ArrayFieldClientComponent } from 'payload'\n\nimport { Collapsible, useField, useForm, useFormFields, useTranslation } from '@payloadcms/ui'\nimport { memo, useCallback } from 'react'\nimport type { GlobalPrivilege } from '../utils/generateGlobalPrivileges.js'\nimport type { Privilege } from '../utils/generatePrivileges.js'\n\ntype CollectionPrivileges = {\n collectionSlug: string\n collectionLabel: Record<string, string>\n privileges: Record<string, Privilege>\n}\n\ntype GlobalPrivileges = {\n globalSlug: string\n globalLabel: Record<string, string>\n privileges: Record<string, GlobalPrivilege>\n}\n\ntype PrivilegesSelectProps = {\n path: string\n collections: CollectionPrivileges[]\n globals: GlobalPrivileges[]\n}\n\n/**\n * Custom array field component for managing privileges in Payload CMS\n * @component\n * @param {Object} props - Component props from Payload CMS\n * @param {string} props.path - Path to the field in the form\n * @param {CollectionPrivileges[]} props.collections - Collections with their privileges\n * @param {GlobalPrivileges[]} props.globals - Globals with their privileges\n */\nconst PrivilegesSelect: ArrayFieldClientComponent = (props) => {\n const { path, collections = [], globals = [] } = props as any\n const { rows } = useField({ path, hasRows: true })\n const { addFieldRow, removeFieldRow, setModified } = useForm()\n const { dispatch } = useFormFields(([_, dispatch]) => ({ dispatch }))\n const { i18n } = useTranslation()\n const locale = i18n?.language || 'en'\n\n // Helper to get label in current locale with fallback\n const getLabel = (labels: Record<string, string>): string => {\n return labels[locale] || labels._default || labels.en || Object.values(labels)[0] || ''\n }\n\n // Use the collections and globals from props\n const collectionsArray = collections\n const globalsArray = globals\n\n /**\n * Get existing privilege values from form fields\n */\n const existingPrivileges = useFormFields(\n ([fields]) =>\n rows?.map((row, index) => {\n const value = fields[`${path}.${index}.privilege`]?.value\n return typeof value === 'string' ? value : ''\n }) || [],\n )\n\n /**\n * Get privilege label from privilegeKey\n */\n const getPrivilegeLabel = useCallback(\n (privilegeKey: string) => {\n // Check collections\n for (const collection of collectionsArray) {\n for (const privilege of Object.values(collection.privileges) as Privilege[]) {\n if (privilege.privilegeKey === privilegeKey) {\n return getLabel(privilege.label)\n }\n }\n }\n // Check globals\n for (const global of globalsArray) {\n for (const privilege of Object.values(global.privileges) as GlobalPrivilege[]) {\n if (privilege.privilegeKey === privilegeKey) {\n return getLabel(privilege.label)\n }\n }\n }\n return privilegeKey\n },\n [collectionsArray, globalsArray, locale],\n )\n\n /**\n * Check if a privilege is already selected\n */\n const isPrivilegeSelected = useCallback(\n (privilegeName: string) => {\n return existingPrivileges.includes(privilegeName)\n },\n [existingPrivileges],\n )\n\n /**\n * Handles privilege selection/deselection\n */\n const handlePrivilegeToggle = useCallback(\n (privilege: Privilege | GlobalPrivilege) => {\n const privilegeKey = privilege.privilegeKey\n const existingIndex = existingPrivileges.indexOf(privilegeKey)\n\n if (existingIndex >= 0) {\n // Remove privilege\n removeFieldRow({ path, rowIndex: existingIndex })\n setModified(true)\n } else {\n // Add privilege\n addFieldRow({\n path,\n schemaPath: `${path}.0.privilege`,\n })\n\n setTimeout(() => {\n dispatch({\n type: 'UPDATE',\n path: `${path}.${rows?.length || 0}.privilege`,\n value: privilegeKey,\n })\n setModified(true)\n }, 0)\n }\n },\n [addFieldRow, dispatch, existingPrivileges, path, removeFieldRow, rows?.length, setModified],\n )\n\n return (\n <div style={{ marginTop: '16px', marginBottom: '16px' }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {/* Collections */}\n {collectionsArray.map((collection: CollectionPrivileges) => {\n const privileges = Object.values(collection.privileges) as Privilege[]\n const selectedCount = privileges.filter((p) => isPrivilegeSelected(p.privilegeKey)).length\n\n return (\n <Collapsible\n key={collection.collectionSlug}\n header={\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span>📦</span>\n <span style={{ fontWeight: 500 }}>\n {getLabel(collection.collectionLabel) || collection.collectionSlug}\n </span>\n </div>\n {selectedCount > 0 && (\n <span\n style={{\n padding: '2px 8px',\n backgroundColor: 'var(--theme-success-100)',\n color: 'var(--theme-success-800)',\n borderRadius: '12px',\n fontSize: '12px',\n fontWeight: 600,\n }}\n >\n {selectedCount}\n </span>\n )}\n </div>\n }\n >\n <div\n style={{\n padding: '16px',\n backgroundColor: 'var(--theme-elevation-50)',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n }}\n >\n {privileges.map((privilege) => {\n const isSelected = isPrivilegeSelected(privilege.privilegeKey)\n const isCustom = privilege.isCustom === true\n return (\n <div\n key={privilege.privilegeKey}\n style={{\n padding: '12px',\n backgroundColor: 'var(--theme-elevation-0)',\n border: `1px solid ${\n isSelected ? 'var(--theme-success-300)' : 'var(--theme-elevation-300)'\n }`,\n borderRadius: '4px',\n transition: 'all 0.2s',\n }}\n >\n <label\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '12px',\n cursor: 'pointer',\n }}\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => handlePrivilegeToggle(privilege)}\n style={{ marginTop: '2px', cursor: 'pointer' }}\n />\n <div style={{ flex: 1 }}>\n <div\n style={{\n fontWeight: 600,\n fontSize: '14px',\n color: 'var(--theme-elevation-1000)',\n marginBottom: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n }}\n >\n {isCustom && <span style={{ fontSize: '16px' }}>⭐</span>}\n {getLabel(privilege.label)}\n </div>\n <div\n style={{\n fontSize: '13px',\n color: 'var(--theme-elevation-700)',\n lineHeight: '1.4',\n marginBottom: '8px',\n }}\n >\n {getLabel(privilege.description)}\n </div>\n <div\n style={{\n padding: '4px 8px',\n backgroundColor: isCustom\n ? 'var(--theme-warning-100)'\n : 'var(--theme-elevation-100)',\n borderRadius: '4px',\n fontSize: '11px',\n fontFamily: 'monospace',\n color: isCustom\n ? 'var(--theme-warning-900)'\n : 'var(--theme-elevation-800)',\n display: 'inline-block',\n }}\n >\n {isCustom && '⭐ '}\n {privilege.privilegeKey}\n </div>\n </div>\n </label>\n </div>\n )\n })}\n </div>\n </Collapsible>\n )\n })}\n\n {/* Globals */}\n {globalsArray.map((global: GlobalPrivileges) => {\n const privileges = Object.values(global.privileges) as GlobalPrivilege[]\n const selectedCount = privileges.filter((p) => isPrivilegeSelected(p.privilegeKey)).length\n\n return (\n <Collapsible\n key={global.globalSlug}\n header={\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span>🌐</span>\n <span style={{ fontWeight: 500 }}>\n {getLabel(global.globalLabel) || global.globalSlug}\n </span>\n </div>\n {selectedCount > 0 && (\n <span\n style={{\n padding: '2px 8px',\n backgroundColor: 'var(--theme-success-100)',\n color: 'var(--theme-success-800)',\n borderRadius: '12px',\n fontSize: '12px',\n fontWeight: 600,\n }}\n >\n {selectedCount}\n </span>\n )}\n </div>\n }\n >\n <div\n style={{\n padding: '16px',\n backgroundColor: 'var(--theme-elevation-50)',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n }}\n >\n {privileges.map((privilege) => {\n const isSelected = isPrivilegeSelected(privilege.privilegeKey)\n const isCustom = privilege.isCustom === true\n return (\n <div\n key={privilege.privilegeKey}\n style={{\n padding: '12px',\n backgroundColor: 'var(--theme-elevation-0)',\n border: `1px solid ${\n isSelected ? 'var(--theme-success-300)' : 'var(--theme-elevation-300)'\n }`,\n borderRadius: '4px',\n transition: 'all 0.2s',\n }}\n >\n <label\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '12px',\n cursor: 'pointer',\n }}\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => handlePrivilegeToggle(privilege)}\n style={{ marginTop: '2px', cursor: 'pointer' }}\n />\n <div style={{ flex: 1 }}>\n <div\n style={{\n fontWeight: 600,\n fontSize: '14px',\n color: 'var(--theme-elevation-1000)',\n marginBottom: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n }}\n >\n {isCustom && <span style={{ fontSize: '16px' }}>⭐</span>}\n {getLabel(privilege.label)}\n </div>\n <div\n style={{\n fontSize: '13px',\n color: 'var(--theme-elevation-700)',\n lineHeight: '1.4',\n marginBottom: '8px',\n }}\n >\n {getLabel(privilege.description)}\n </div>\n <div\n style={{\n padding: '4px 8px',\n backgroundColor: isCustom\n ? 'var(--theme-warning-100)'\n : 'var(--theme-elevation-100)',\n borderRadius: '4px',\n fontSize: '11px',\n fontFamily: 'monospace',\n color: isCustom\n ? 'var(--theme-warning-900)'\n : 'var(--theme-elevation-800)',\n display: 'inline-block',\n }}\n >\n {isCustom && '⭐ '}\n {privilege.privilegeKey}\n </div>\n </div>\n </label>\n </div>\n )\n })}\n </div>\n </Collapsible>\n )\n })}\n </div>\n\n {/* Selected Privileges Summary */}\n {existingPrivileges.length > 0 && (\n <div\n style={{\n marginTop: '16px',\n padding: '16px',\n backgroundColor: 'var(--theme-elevation-100)',\n borderRadius: '4px',\n }}\n >\n <h5\n style={{\n margin: '0 0 12px 0',\n fontSize: '14px',\n fontWeight: 600,\n color: 'var(--theme-elevation-1000)',\n }}\n >\n {(i18n.t as (key: string) => string)(\n 'plugin-roles-privileges:privileges-selected-count',\n )}{' '}\n ({existingPrivileges.length})\n </h5>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px' }}>\n {existingPrivileges.map((privilegeKey, index) => (\n <div\n key={`${privilegeKey}-${index}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n padding: '6px 12px',\n backgroundColor: 'var(--theme-success-100)',\n border: '1px solid var(--theme-success-300)',\n borderRadius: '16px',\n fontSize: '12px',\n color: 'var(--theme-success-800)',\n }}\n >\n <span>{getPrivilegeLabel(privilegeKey)}</span>\n <button\n type=\"button\"\n onClick={() => {\n removeFieldRow({ path, rowIndex: index })\n setModified(true)\n }}\n style={{\n background: 'none',\n border: 'none',\n color: 'var(--theme-success-600)',\n cursor: 'pointer',\n padding: 0,\n display: 'flex',\n alignItems: 'center',\n fontSize: '16px',\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default memo(PrivilegesSelect)\nexport type { CollectionPrivileges, GlobalPrivileges }\n"],"names":["Collapsible","useField","useForm","useFormFields","useTranslation","memo","useCallback","PrivilegesSelect","props","path","collections","globals","rows","hasRows","addFieldRow","removeFieldRow","setModified","dispatch","_","i18n","locale","language","getLabel","labels","_default","en","Object","values","collectionsArray","globalsArray","existingPrivileges","fields","map","row","index","value","getPrivilegeLabel","privilegeKey","collection","privilege","privileges","label","global","isPrivilegeSelected","privilegeName","includes","handlePrivilegeToggle","existingIndex","indexOf","rowIndex","schemaPath","setTimeout","type","length","div","style","marginTop","marginBottom","display","flexDirection","gap","selectedCount","filter","p","header","alignItems","justifyContent","width","span","fontWeight","collectionLabel","collectionSlug","padding","backgroundColor","color","borderRadius","fontSize","isSelected","isCustom","border","transition","cursor","input","checked","onChange","flex","lineHeight","description","fontFamily","globalLabel","globalSlug","h5","margin","t","flexWrap","button","onClick","background"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/components/PrivilegesSelect.tsx"],"sourcesContent":["'use client'\nimport type { ArrayFieldClientComponent } from 'payload'\n\nimport { Collapsible, useField, useForm, useFormFields, useTranslation } from '@payloadcms/ui'\nimport { memo, useCallback } from 'react'\n\nimport type { GlobalPrivilege } from '../utils/generateGlobalPrivileges.js'\nimport type { Privilege } from '../utils/generatePrivileges.js'\n\ntype CollectionPrivileges = {\n collectionLabel: Record<string, string>\n collectionSlug: string\n privileges: Record<string, Privilege>\n}\n\ntype GlobalPrivileges = {\n globalLabel: Record<string, string>\n globalSlug: string\n privileges: Record<string, GlobalPrivilege>\n}\n\n/**\n * Custom array field component for managing privileges in Payload CMS\n * @component\n * @param {Object} props - Component props from Payload CMS\n * @param {string} props.path - Path to the field in the form\n * @param {CollectionPrivileges[]} props.collections - Collections with their privileges\n * @param {GlobalPrivileges[]} props.globals - Globals with their privileges\n */\nconst PrivilegesSelect: ArrayFieldClientComponent = (props) => {\n const {\n collections = [],\n globals = [],\n path,\n } = props as {\n collections?: CollectionPrivileges[]\n globals?: GlobalPrivileges[]\n path: string\n }\n const { rows } = useField({ hasRows: true, path })\n const { addFieldRow, removeFieldRow, setModified } = useForm()\n const { dispatch } = useFormFields(([_, dispatch]) => ({ dispatch }))\n const { i18n } = useTranslation()\n const locale = i18n?.language || 'en'\n\n // Helper to get label in current locale with fallback\n const getLabel = useCallback(\n (labels: Record<string, string>): string => {\n return labels[locale] || labels._default || labels.en || Object.values(labels)[0] || ''\n },\n [locale],\n )\n\n // Use the collections and globals from props\n const collectionsArray = collections\n const globalsArray = globals\n\n /**\n * Get existing privilege values from form fields\n */\n const existingPrivileges = useFormFields(\n ([fields]) =>\n rows?.map((row, index) => {\n const value = fields[`${path}.${index}.privilege`]?.value\n return typeof value === 'string' ? value : ''\n }) || [],\n )\n\n /**\n * Get privilege label from privilegeKey\n */\n const getPrivilegeLabel = useCallback(\n (privilegeKey: string) => {\n // Check collections\n for (const collection of collectionsArray) {\n for (const privilege of Object.values(collection.privileges)) {\n if (privilege.privilegeKey === privilegeKey) {\n return getLabel(privilege.label)\n }\n }\n }\n // Check globals\n for (const global of globalsArray) {\n for (const privilege of Object.values(global.privileges)) {\n if (privilege.privilegeKey === privilegeKey) {\n return getLabel(privilege.label)\n }\n }\n }\n return privilegeKey\n },\n [collectionsArray, globalsArray, getLabel],\n )\n\n /**\n * Check if a privilege is already selected\n */\n const isPrivilegeSelected = useCallback(\n (privilegeName: string) => {\n return existingPrivileges.includes(privilegeName)\n },\n [existingPrivileges],\n )\n\n /**\n * Handles privilege selection/deselection\n */\n const handlePrivilegeToggle = useCallback(\n (privilege: GlobalPrivilege | Privilege) => {\n const privilegeKey = privilege.privilegeKey\n const existingIndex = existingPrivileges.indexOf(privilegeKey)\n\n if (existingIndex >= 0) {\n // Remove privilege\n removeFieldRow({ path, rowIndex: existingIndex })\n setModified(true)\n } else {\n // Add privilege\n addFieldRow({\n path,\n schemaPath: `${path}.0.privilege`,\n })\n\n setTimeout(() => {\n dispatch({\n type: 'UPDATE',\n path: `${path}.${rows?.length || 0}.privilege`,\n value: privilegeKey,\n })\n setModified(true)\n }, 0)\n }\n },\n [addFieldRow, dispatch, existingPrivileges, path, removeFieldRow, rows?.length, setModified],\n )\n\n return (\n <div style={{ marginBottom: '16px', marginTop: '16px' }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {/* Collections */}\n {collectionsArray.map((collection: CollectionPrivileges) => {\n const privileges = Object.values(collection.privileges)\n const selectedCount = privileges.filter((p) => isPrivilegeSelected(p.privilegeKey)).length\n\n return (\n <Collapsible\n header={\n <div\n style={{\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n }}\n >\n <div style={{ alignItems: 'center', display: 'flex', gap: '8px' }}>\n <span aria-label=\"Collection\" role=\"img\">\n 📦\n </span>\n <span style={{ fontWeight: 500 }}>\n {getLabel(collection.collectionLabel) || collection.collectionSlug}\n </span>\n </div>\n {selectedCount > 0 && (\n <span\n style={{\n backgroundColor: 'var(--theme-success-100)',\n borderRadius: '12px',\n color: 'var(--theme-success-800)',\n fontSize: '12px',\n fontWeight: 600,\n padding: '2px 8px',\n }}\n >\n {selectedCount}\n </span>\n )}\n </div>\n }\n key={collection.collectionSlug}\n >\n <div\n style={{\n backgroundColor: 'var(--theme-elevation-50)',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n padding: '16px',\n }}\n >\n {privileges.map((privilege) => {\n const isSelected = isPrivilegeSelected(privilege.privilegeKey)\n const isCustom = privilege.isCustom === true\n return (\n <div\n key={privilege.privilegeKey}\n style={{\n backgroundColor: 'var(--theme-elevation-0)',\n border: `1px solid ${\n isSelected ? 'var(--theme-success-300)' : 'var(--theme-elevation-300)'\n }`,\n borderRadius: '4px',\n padding: '12px',\n transition: 'all 0.2s',\n }}\n >\n <label\n aria-label={`Select privilege: ${getLabel(privilege.label)}`}\n htmlFor={`global-privilege-${privilege.privilegeKey}`}\n style={{\n alignItems: 'flex-start',\n cursor: 'pointer',\n display: 'flex',\n gap: '12px',\n }}\n >\n <input\n aria-label={`Select privilege: ${getLabel(privilege.label)}`}\n checked={isSelected}\n id={`global-privilege-${privilege.privilegeKey}`}\n onChange={() => handlePrivilegeToggle(privilege)}\n style={{ cursor: 'pointer', marginTop: '2px' }}\n type=\"checkbox\"\n />\n <div style={{ flex: 1 }}>\n <div\n style={{\n alignItems: 'center',\n color: 'var(--theme-elevation-1000)',\n display: 'flex',\n fontSize: '14px',\n fontWeight: 600,\n gap: '6px',\n marginBottom: '4px',\n }}\n >\n {isCustom && (\n <span\n aria-label=\"Custom privilege\"\n role=\"img\"\n style={{ fontSize: '16px' }}\n >\n ⭐\n </span>\n )}\n {getLabel(privilege.label)}\n </div>\n <div\n style={{\n color: 'var(--theme-elevation-700)',\n fontSize: '13px',\n lineHeight: '1.4',\n marginBottom: '8px',\n }}\n >\n {getLabel(privilege.description)}\n </div>\n <div\n style={{\n backgroundColor: isCustom\n ? 'var(--theme-warning-100)'\n : 'var(--theme-elevation-100)',\n borderRadius: '4px',\n color: isCustom\n ? 'var(--theme-warning-900)'\n : 'var(--theme-elevation-800)',\n display: 'inline-block',\n fontFamily: 'monospace',\n fontSize: '11px',\n padding: '4px 8px',\n }}\n >\n {isCustom && '⭐ '}\n {privilege.privilegeKey}\n </div>\n </div>\n </label>\n </div>\n )\n })}\n </div>\n </Collapsible>\n )\n })}\n\n {/* Globals */}\n {globalsArray.map((global: GlobalPrivileges) => {\n const privileges = Object.values(global.privileges)\n const selectedCount = privileges.filter((p) => isPrivilegeSelected(p.privilegeKey)).length\n\n return (\n <Collapsible\n header={\n <div\n style={{\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n }}\n >\n <div style={{ alignItems: 'center', display: 'flex', gap: '8px' }}>\n <span aria-label=\"Global\" role=\"img\">\n 🌐\n </span>\n <span style={{ fontWeight: 500 }}>\n {getLabel(global.globalLabel) || global.globalSlug}\n </span>\n </div>\n {selectedCount > 0 && (\n <span\n style={{\n backgroundColor: 'var(--theme-success-100)',\n borderRadius: '12px',\n color: 'var(--theme-success-800)',\n fontSize: '12px',\n fontWeight: 600,\n padding: '2px 8px',\n }}\n >\n {selectedCount}\n </span>\n )}\n </div>\n }\n key={global.globalSlug}\n >\n <div\n style={{\n backgroundColor: 'var(--theme-elevation-50)',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n padding: '16px',\n }}\n >\n {privileges.map((privilege) => {\n const isSelected = isPrivilegeSelected(privilege.privilegeKey)\n const isCustom = privilege.isCustom === true\n return (\n <div\n key={privilege.privilegeKey}\n style={{\n backgroundColor: 'var(--theme-elevation-0)',\n border: `1px solid ${\n isSelected ? 'var(--theme-success-300)' : 'var(--theme-elevation-300)'\n }`,\n borderRadius: '4px',\n padding: '12px',\n transition: 'all 0.2s',\n }}\n >\n <label\n aria-label={`Select privilege: ${getLabel(privilege.label)}`}\n htmlFor={`global-privilege-${privilege.privilegeKey}`}\n style={{\n alignItems: 'flex-start',\n cursor: 'pointer',\n display: 'flex',\n gap: '12px',\n }}\n >\n <input\n aria-label={`Select privilege: ${getLabel(privilege.label)}`}\n checked={isSelected}\n id={`global-privilege-${privilege.privilegeKey}`}\n onChange={() => handlePrivilegeToggle(privilege)}\n style={{ cursor: 'pointer', marginTop: '2px' }}\n type=\"checkbox\"\n />\n <div style={{ flex: 1 }}>\n <div\n style={{\n alignItems: 'center',\n color: 'var(--theme-elevation-1000)',\n display: 'flex',\n fontSize: '14px',\n fontWeight: 600,\n gap: '6px',\n marginBottom: '4px',\n }}\n >\n {isCustom && (\n <span\n aria-label=\"Custom privilege\"\n role=\"img\"\n style={{ fontSize: '16px' }}\n >\n ⭐\n </span>\n )}\n {getLabel(privilege.label)}\n </div>\n <div\n style={{\n color: 'var(--theme-elevation-700)',\n fontSize: '13px',\n lineHeight: '1.4',\n marginBottom: '8px',\n }}\n >\n {getLabel(privilege.description)}\n </div>\n <div\n style={{\n backgroundColor: isCustom\n ? 'var(--theme-warning-100)'\n : 'var(--theme-elevation-100)',\n borderRadius: '4px',\n color: isCustom\n ? 'var(--theme-warning-900)'\n : 'var(--theme-elevation-800)',\n display: 'inline-block',\n fontFamily: 'monospace',\n fontSize: '11px',\n padding: '4px 8px',\n }}\n >\n {isCustom && '⭐ '}\n {privilege.privilegeKey}\n </div>\n </div>\n </label>\n </div>\n )\n })}\n </div>\n </Collapsible>\n )\n })}\n </div>\n\n {/* Selected Privileges Summary */}\n {existingPrivileges.length > 0 && (\n <div\n style={{\n backgroundColor: 'var(--theme-elevation-100)',\n borderRadius: '4px',\n marginTop: '16px',\n padding: '16px',\n }}\n >\n <h5\n style={{\n color: 'var(--theme-elevation-1000)',\n fontSize: '14px',\n fontWeight: 600,\n margin: '0 0 12px 0',\n }}\n >\n {(i18n.t as (key: string) => string)(\n 'plugin-roles-privileges:privileges-selected-count',\n )}{' '}\n ({existingPrivileges.length})\n </h5>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px' }}>\n {existingPrivileges.map((privilegeKey, index) => (\n <div\n key={`${privilegeKey}-${index}`}\n style={{\n alignItems: 'center',\n backgroundColor: 'var(--theme-success-100)',\n border: '1px solid var(--theme-success-300)',\n borderRadius: '16px',\n color: 'var(--theme-success-800)',\n display: 'inline-flex',\n fontSize: '12px',\n gap: '8px',\n padding: '6px 12px',\n }}\n >\n <span>{getPrivilegeLabel(privilegeKey)}</span>\n <button\n onClick={() => {\n removeFieldRow({ path, rowIndex: index })\n setModified(true)\n }}\n style={{\n alignItems: 'center',\n background: 'none',\n border: 'none',\n color: 'var(--theme-success-600)',\n cursor: 'pointer',\n display: 'flex',\n fontSize: '16px',\n lineHeight: 1,\n padding: 0,\n }}\n type=\"button\"\n >\n ×\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default memo(PrivilegesSelect)\nexport type { CollectionPrivileges, GlobalPrivileges }\n"],"names":["Collapsible","useField","useForm","useFormFields","useTranslation","memo","useCallback","PrivilegesSelect","props","collections","globals","path","rows","hasRows","addFieldRow","removeFieldRow","setModified","dispatch","_","i18n","locale","language","getLabel","labels","_default","en","Object","values","collectionsArray","globalsArray","existingPrivileges","fields","map","row","index","value","getPrivilegeLabel","privilegeKey","collection","privilege","privileges","label","global","isPrivilegeSelected","privilegeName","includes","handlePrivilegeToggle","existingIndex","indexOf","rowIndex","schemaPath","setTimeout","type","length","div","style","marginBottom","marginTop","display","flexDirection","gap","selectedCount","filter","p","header","alignItems","justifyContent","width","span","aria-label","role","fontWeight","collectionLabel","collectionSlug","backgroundColor","borderRadius","color","fontSize","padding","isSelected","isCustom","border","transition","htmlFor","cursor","input","checked","id","onChange","flex","lineHeight","description","fontFamily","globalLabel","globalSlug","h5","margin","t","flexWrap","button","onClick","background"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
- export { checkAllPrivileges, checkAnyPrivilege, checkPrivilege, checkPrivileges, hasAllPrivileges, hasAnyPrivilege, hasPrivilege, privilegesAccess, } from '../utils/privilegesAccess.js';
2
- export { allPrivilegesMap, generateCollectionPrivileges, generatePrivilegeKey, getAllPrivilegeKeys, getAllPrivileges, } from '../utils/generatePrivileges.js';
3
- export { allGlobalPrivilegesMap, generateGlobalPrivilegeKey, generateGlobalPrivileges, getAllGlobalPrivilegeKeys, getAllGlobalPrivileges, } from '../utils/generateGlobalPrivileges.js';
4
- export { customPrivilegesRegistry, registerCustomPrivilege, registerCustomPrivileges, type CustomGlobalPrivilege, type CustomPrivilegeConfig, } from '../utils/createCustomPrivilege.js';
5
1
  export { createRolesCollection, ensureSuperAdminDontGetDeleted, ensureSuperAdminDontGetUpdated, } from '../collections/roles.js';
2
+ export { createAssignSuperAdminToFirstUserHook, wrapUserCollectionWithSuperAdminHook, } from '../utils/assignSuperAdminToFirstUser.js';
3
+ export { customPrivilegesRegistry, registerCustomPrivilege, registerCustomPrivileges, type CustomGlobalPrivilege, type CustomPrivilegeConfig, } from '../utils/createCustomPrivilege.js';
4
+ export { allGlobalPrivilegesMap, generateGlobalPrivilegeKey, generateGlobalPrivileges, getAllGlobalPrivilegeKeys, getAllGlobalPrivileges, } from '../utils/generateGlobalPrivileges.js';
5
+ export { allPrivilegesMap, generateCollectionPrivileges, generatePrivilegeKey, getAllPrivilegeKeys, getAllPrivileges, } from '../utils/generatePrivileges.js';
6
+ export { checkAllPrivileges, checkAnyPrivilege, checkPrivilege, checkPrivileges, hasAllPrivileges, hasAnyPrivilege, hasPrivilege, privilegesAccess, } from '../utils/privilegesAccess.js';
6
7
  export { seedSuperAdminRole } from '../utils/seedSuperAdminRole.js';
@@ -1,13 +1,15 @@
1
- // Re-export utility functions for access control
2
- export { checkAllPrivileges, checkAnyPrivilege, checkPrivilege, checkPrivileges, hasAllPrivileges, hasAnyPrivilege, hasPrivilege, privilegesAccess } from '../utils/privilegesAccess.js';
3
- // Re-export collection privilege utilities
4
- export { allPrivilegesMap, generateCollectionPrivileges, generatePrivilegeKey, getAllPrivilegeKeys, getAllPrivileges } from '../utils/generatePrivileges.js';
5
- // Re-export global privilege utilities
6
- export { allGlobalPrivilegesMap, generateGlobalPrivilegeKey, generateGlobalPrivileges, getAllGlobalPrivilegeKeys, getAllGlobalPrivileges } from '../utils/generateGlobalPrivileges.js';
7
- // Re-export custom privilege registration utilities
8
- export { customPrivilegesRegistry, registerCustomPrivilege, registerCustomPrivileges } from '../utils/createCustomPrivilege.js';
9
1
  // Re-export roles collection creation helper
10
2
  export { createRolesCollection, ensureSuperAdminDontGetDeleted, ensureSuperAdminDontGetUpdated } from '../collections/roles.js';
3
+ // Re-export first user super admin assignment utilities
4
+ export { createAssignSuperAdminToFirstUserHook, wrapUserCollectionWithSuperAdminHook } from '../utils/assignSuperAdminToFirstUser.js';
5
+ // Re-export custom privilege registration utilities
6
+ export { customPrivilegesRegistry, registerCustomPrivilege, registerCustomPrivileges } from '../utils/createCustomPrivilege.js';
7
+ // Re-export global privilege utilities
8
+ export { allGlobalPrivilegesMap, generateGlobalPrivilegeKey, generateGlobalPrivileges, getAllGlobalPrivilegeKeys, getAllGlobalPrivileges } from '../utils/generateGlobalPrivileges.js';
9
+ // Re-export collection privilege utilities
10
+ export { allPrivilegesMap, generateCollectionPrivileges, generatePrivilegeKey, getAllPrivilegeKeys, getAllPrivileges } from '../utils/generatePrivileges.js';
11
+ // Re-export utility functions for access control
12
+ export { checkAllPrivileges, checkAnyPrivilege, checkPrivilege, checkPrivileges, hasAllPrivileges, hasAnyPrivilege, hasPrivilege, privilegesAccess } from '../utils/privilegesAccess.js';
11
13
  // Re-export seed super admin utility
12
14
  export { seedSuperAdminRole } from '../utils/seedSuperAdminRole.js';
13
15
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/utilities.ts"],"sourcesContent":["// Re-export utility functions for access control\nexport {\n checkAllPrivileges,\n checkAnyPrivilege,\n checkPrivilege,\n checkPrivileges,\n hasAllPrivileges,\n hasAnyPrivilege,\n hasPrivilege,\n privilegesAccess,\n} from '../utils/privilegesAccess.js'\n\n// Re-export collection privilege utilities\nexport {\n allPrivilegesMap,\n generateCollectionPrivileges,\n generatePrivilegeKey,\n getAllPrivilegeKeys,\n getAllPrivileges,\n} from '../utils/generatePrivileges.js'\n\n// Re-export global privilege utilities\nexport {\n allGlobalPrivilegesMap,\n generateGlobalPrivilegeKey,\n generateGlobalPrivileges,\n getAllGlobalPrivilegeKeys,\n getAllGlobalPrivileges,\n} from '../utils/generateGlobalPrivileges.js'\n\n// Re-export custom privilege registration utilities\nexport {\n customPrivilegesRegistry,\n registerCustomPrivilege,\n registerCustomPrivileges,\n type CustomGlobalPrivilege,\n type CustomPrivilegeConfig,\n} from '../utils/createCustomPrivilege.js'\n\n// Re-export roles collection creation helper\nexport {\n createRolesCollection,\n ensureSuperAdminDontGetDeleted,\n ensureSuperAdminDontGetUpdated,\n} from '../collections/roles.js'\n\n// Re-export seed super admin utility\nexport { seedSuperAdminRole } from '../utils/seedSuperAdminRole.js'\n"],"names":["checkAllPrivileges","checkAnyPrivilege","checkPrivilege","checkPrivileges","hasAllPrivileges","hasAnyPrivilege","hasPrivilege","privilegesAccess","allPrivilegesMap","generateCollectionPrivileges","generatePrivilegeKey","getAllPrivilegeKeys","getAllPrivileges","allGlobalPrivilegesMap","generateGlobalPrivilegeKey","generateGlobalPrivileges","getAllGlobalPrivilegeKeys","getAllGlobalPrivileges","customPrivilegesRegistry","registerCustomPrivilege","registerCustomPrivileges","createRolesCollection","ensureSuperAdminDontGetDeleted","ensureSuperAdminDontGetUpdated","seedSuperAdminRole"],"mappings":"AAAA,iDAAiD;AACjD,SACEA,kBAAkB,EAClBC,iBAAiB,EACjBC,cAAc,EACdC,eAAe,EACfC,gBAAgB,EAChBC,eAAe,EACfC,YAAY,EACZC,gBAAgB,QACX,+BAA8B;AAErC,2CAA2C;AAC3C,SACEC,gBAAgB,EAChBC,4BAA4B,EAC5BC,oBAAoB,EACpBC,mBAAmB,EACnBC,gBAAgB,QACX,iCAAgC;AAEvC,uCAAuC;AACvC,SACEC,sBAAsB,EACtBC,0BAA0B,EAC1BC,wBAAwB,EACxBC,yBAAyB,EACzBC,sBAAsB,QACjB,uCAAsC;AAE7C,oDAAoD;AACpD,SACEC,wBAAwB,EACxBC,uBAAuB,EACvBC,wBAAwB,QAGnB,oCAAmC;AAE1C,6CAA6C;AAC7C,SACEC,qBAAqB,EACrBC,8BAA8B,EAC9BC,8BAA8B,QACzB,0BAAyB;AAEhC,qCAAqC;AACrC,SAASC,kBAAkB,QAAQ,iCAAgC"}
1
+ {"version":3,"sources":["../../src/exports/utilities.ts"],"sourcesContent":["// Re-export roles collection creation helper\nexport {\n createRolesCollection,\n ensureSuperAdminDontGetDeleted,\n ensureSuperAdminDontGetUpdated,\n} from '../collections/roles.js'\n\n// Re-export first user super admin assignment utilities\nexport {\n createAssignSuperAdminToFirstUserHook,\n wrapUserCollectionWithSuperAdminHook,\n} from '../utils/assignSuperAdminToFirstUser.js'\n\n// Re-export custom privilege registration utilities\nexport {\n customPrivilegesRegistry,\n registerCustomPrivilege,\n registerCustomPrivileges,\n type CustomGlobalPrivilege,\n type CustomPrivilegeConfig,\n} from '../utils/createCustomPrivilege.js'\n\n// Re-export global privilege utilities\nexport {\n allGlobalPrivilegesMap,\n generateGlobalPrivilegeKey,\n generateGlobalPrivileges,\n getAllGlobalPrivilegeKeys,\n getAllGlobalPrivileges,\n} from '../utils/generateGlobalPrivileges.js'\n\n// Re-export collection privilege utilities\nexport {\n allPrivilegesMap,\n generateCollectionPrivileges,\n generatePrivilegeKey,\n getAllPrivilegeKeys,\n getAllPrivileges,\n} from '../utils/generatePrivileges.js'\n\n// Re-export utility functions for access control\nexport {\n checkAllPrivileges,\n checkAnyPrivilege,\n checkPrivilege,\n checkPrivileges,\n hasAllPrivileges,\n hasAnyPrivilege,\n hasPrivilege,\n privilegesAccess,\n} from '../utils/privilegesAccess.js'\n\n// Re-export seed super admin utility\nexport { seedSuperAdminRole } from '../utils/seedSuperAdminRole.js'\n"],"names":["createRolesCollection","ensureSuperAdminDontGetDeleted","ensureSuperAdminDontGetUpdated","createAssignSuperAdminToFirstUserHook","wrapUserCollectionWithSuperAdminHook","customPrivilegesRegistry","registerCustomPrivilege","registerCustomPrivileges","allGlobalPrivilegesMap","generateGlobalPrivilegeKey","generateGlobalPrivileges","getAllGlobalPrivilegeKeys","getAllGlobalPrivileges","allPrivilegesMap","generateCollectionPrivileges","generatePrivilegeKey","getAllPrivilegeKeys","getAllPrivileges","checkAllPrivileges","checkAnyPrivilege","checkPrivilege","checkPrivileges","hasAllPrivileges","hasAnyPrivilege","hasPrivilege","privilegesAccess","seedSuperAdminRole"],"mappings":"AAAA,6CAA6C;AAC7C,SACEA,qBAAqB,EACrBC,8BAA8B,EAC9BC,8BAA8B,QACzB,0BAAyB;AAEhC,wDAAwD;AACxD,SACEC,qCAAqC,EACrCC,oCAAoC,QAC/B,0CAAyC;AAEhD,oDAAoD;AACpD,SACEC,wBAAwB,EACxBC,uBAAuB,EACvBC,wBAAwB,QAGnB,oCAAmC;AAE1C,uCAAuC;AACvC,SACEC,sBAAsB,EACtBC,0BAA0B,EAC1BC,wBAAwB,EACxBC,yBAAyB,EACzBC,sBAAsB,QACjB,uCAAsC;AAE7C,2CAA2C;AAC3C,SACEC,gBAAgB,EAChBC,4BAA4B,EAC5BC,oBAAoB,EACpBC,mBAAmB,EACnBC,gBAAgB,QACX,iCAAgC;AAEvC,iDAAiD;AACjD,SACEC,kBAAkB,EAClBC,iBAAiB,EACjBC,cAAc,EACdC,eAAe,EACfC,gBAAgB,EAChBC,eAAe,EACfC,YAAY,EACZC,gBAAgB,QACX,+BAA8B;AAErC,qCAAqC;AACrC,SAASC,kBAAkB,QAAQ,iCAAgC"}