@commercetools-frontend/permissions 27.10.0 → 27.11.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.
@@ -15,12 +15,12 @@ var _Object$defineProperties = require('@babel/runtime-corejs3/core-js-stable/ob
15
15
  var _Object$defineProperty = require('@babel/runtime-corejs3/core-js-stable/object/define-property');
16
16
  var _defineProperty = require('@babel/runtime-corejs3/helpers/defineProperty');
17
17
  var _objectWithoutProperties = require('@babel/runtime-corejs3/helpers/objectWithoutProperties');
18
+ var _includesInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/includes');
18
19
  var warning = require('tiny-warning');
19
20
  var applicationShellConnectors = require('@commercetools-frontend/application-shell-connectors');
20
21
  var sentry = require('@commercetools-frontend/sentry');
21
22
  var _slicedToArray = require('@babel/runtime-corejs3/helpers/slicedToArray');
22
23
  var _startsWithInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/starts-with');
23
- var _includesInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/includes');
24
24
  var _everyInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/every');
25
25
  var _someInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/some');
26
26
  var _valuesInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/values');
@@ -41,9 +41,9 @@ var _forEachInstanceProperty__default = /*#__PURE__*/_interopDefault(_forEachIns
41
41
  var _Object$getOwnPropertyDescriptors__default = /*#__PURE__*/_interopDefault(_Object$getOwnPropertyDescriptors);
42
42
  var _Object$defineProperties__default = /*#__PURE__*/_interopDefault(_Object$defineProperties);
43
43
  var _Object$defineProperty__default = /*#__PURE__*/_interopDefault(_Object$defineProperty);
44
+ var _includesInstanceProperty__default = /*#__PURE__*/_interopDefault(_includesInstanceProperty);
44
45
  var warning__default = /*#__PURE__*/_interopDefault(warning);
45
46
  var _startsWithInstanceProperty__default = /*#__PURE__*/_interopDefault(_startsWithInstanceProperty);
46
- var _includesInstanceProperty__default = /*#__PURE__*/_interopDefault(_includesInstanceProperty);
47
47
  var _everyInstanceProperty__default = /*#__PURE__*/_interopDefault(_everyInstanceProperty);
48
48
  var _someInstanceProperty__default = /*#__PURE__*/_interopDefault(_someInstanceProperty);
49
49
  var _valuesInstanceProperty__default = /*#__PURE__*/_interopDefault(_valuesInstanceProperty);
@@ -52,7 +52,7 @@ var _Object$entries__default = /*#__PURE__*/_interopDefault(_Object$entries);
52
52
  var upperFirst__default = /*#__PURE__*/_interopDefault(upperFirst);
53
53
 
54
54
  // NOTE: This string will be replaced on build time with the package version.
55
- var version = "27.10.0";
55
+ var version = "27.11.0";
56
56
 
57
57
  // Permissions
58
58
 
@@ -273,15 +273,29 @@ const useIsAuthorized = _ref => {
273
273
  selectDataFenceData = _ref.selectDataFenceData,
274
274
  _ref$shouldMatchSomeP = _ref.shouldMatchSomePermissions,
275
275
  shouldMatchSomePermissions = _ref$shouldMatchSomeP === void 0 ? false : _ref$shouldMatchSomeP,
276
+ isUserAdminOfCurrentProject = _ref.isUserAdminOfCurrentProject,
276
277
  projectPermissions = _ref.projectPermissions;
277
278
  const impliedPermissions = getImpliedPermissions(demandedPermissions);
278
279
  useWarning(!demandedActionRights || demandedActionRights.length === 1, `@commercetools-frontend/permissions: It is recommended to pass a single demanded action right while using the hook, HoC or component multiple times.`);
279
280
  useWarning(!demandedPermissions || demandedPermissions.length === 1, `@commercetools-frontend/permissions: It is recommended to pass a single demanded permission while using the hook, HoC or component multiple times.`);
280
281
  useWarning(shouldMatchSomePermissions === false, `@commercetools-frontend/permissions: It is recommended not to use 'shouldMatchSomePermissions' but instead use the hook, HoC or component multiple times.`);
281
282
  useWarning(!impliedPermissions || impliedPermissions.length === 0, `@commercetools-frontend/permissions: Demanded permissions contain implied permissions. These are implied: ${impliedPermissions.join(', ')}.`);
283
+
284
+ // Check first if we need an "admin" permission check
285
+ const hasDemandedAdministratorPermission = _includesInstanceProperty__default["default"](demandedPermissions).call(demandedPermissions, 'Administrator');
286
+ useWarning(!hasDemandedAdministratorPermission || demandedPermissions.length === 1, `@commercetools-frontend/permissions: When demanding the "Administrator" permission, no other permissions must be demanded.`);
287
+ const hasDemandedAdministratorOfCurrentProjectPermission = _includesInstanceProperty__default["default"](demandedPermissions).call(demandedPermissions, 'AdministratorOfCurrentProject');
288
+ useWarning(!hasDemandedAdministratorOfCurrentProjectPermission || demandedPermissions.length === 1, `@commercetools-frontend/permissions: When demanding the "AdministratorOfCurrentProject" permission, no other permissions must be demanded.`);
289
+ const isAdminOfAnyOrganization = applicationShellConnectors.useApplicationContext(applicationContext => applicationContext.user?.isAdminOfAnyOrganization ?? false);
282
290
  const actualPermissions = applicationShellConnectors.useApplicationContext(applicationContext => projectPermissions?.permissions ?? applicationContext.permissions);
283
291
  const actualActionRights = applicationShellConnectors.useApplicationContext(applicationContext => projectPermissions?.actionRights ?? applicationContext.actionRights);
284
292
  const actualDataFences = applicationShellConnectors.useApplicationContext(applicationContext => projectPermissions?.dataFences ?? applicationContext.dataFences);
293
+ if (hasDemandedAdministratorPermission) {
294
+ return isAdminOfAnyOrganization;
295
+ }
296
+ if (hasDemandedAdministratorOfCurrentProjectPermission) {
297
+ return isUserAdminOfCurrentProject ?? false;
298
+ }
285
299
 
286
300
  // if the user has no permissions and no dataFences assigned to them, they are not authorized
287
301
  if (!actualPermissions && !actualDataFences) return false;
@@ -326,6 +340,7 @@ const Authorized = _ref => {
326
340
  demandedDataFences: props.demandedDataFences,
327
341
  selectDataFenceData: props.selectDataFenceData,
328
342
  shouldMatchSomePermissions: shouldMatchSomePermissions,
343
+ isUserAdminOfCurrentProject: props.isUserAdminOfCurrentProject,
329
344
  projectPermissions: props.projectPermissions
330
345
  });
331
346
  return jsxRuntime.jsx(jsxRuntime.Fragment, {
@@ -370,6 +385,7 @@ const RestrictedByPermissions = props => {
370
385
  demandedActionRights: props.actionRights,
371
386
  demandedDataFences: props.dataFences,
372
387
  selectDataFenceData: props.selectDataFenceData,
388
+ isUserAdminOfCurrentProject: props.isUserAdminOfCurrentProject,
373
389
  projectPermissions: props.projectPermissions,
374
390
  render: isAuthorized => {
375
391
  if (typeof props.children === 'function') return props.children({
@@ -15,12 +15,12 @@ var _Object$defineProperties = require('@babel/runtime-corejs3/core-js-stable/ob
15
15
  var _Object$defineProperty = require('@babel/runtime-corejs3/core-js-stable/object/define-property');
16
16
  var _defineProperty = require('@babel/runtime-corejs3/helpers/defineProperty');
17
17
  var _objectWithoutProperties = require('@babel/runtime-corejs3/helpers/objectWithoutProperties');
18
+ var _includesInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/includes');
18
19
  require('tiny-warning');
19
20
  var applicationShellConnectors = require('@commercetools-frontend/application-shell-connectors');
20
21
  var sentry = require('@commercetools-frontend/sentry');
21
22
  var _slicedToArray = require('@babel/runtime-corejs3/helpers/slicedToArray');
22
23
  var _startsWithInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/starts-with');
23
- var _includesInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/includes');
24
24
  var _everyInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/every');
25
25
  var _someInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/some');
26
26
  var _valuesInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/values');
@@ -41,8 +41,8 @@ var _forEachInstanceProperty__default = /*#__PURE__*/_interopDefault(_forEachIns
41
41
  var _Object$getOwnPropertyDescriptors__default = /*#__PURE__*/_interopDefault(_Object$getOwnPropertyDescriptors);
42
42
  var _Object$defineProperties__default = /*#__PURE__*/_interopDefault(_Object$defineProperties);
43
43
  var _Object$defineProperty__default = /*#__PURE__*/_interopDefault(_Object$defineProperty);
44
- var _startsWithInstanceProperty__default = /*#__PURE__*/_interopDefault(_startsWithInstanceProperty);
45
44
  var _includesInstanceProperty__default = /*#__PURE__*/_interopDefault(_includesInstanceProperty);
45
+ var _startsWithInstanceProperty__default = /*#__PURE__*/_interopDefault(_startsWithInstanceProperty);
46
46
  var _everyInstanceProperty__default = /*#__PURE__*/_interopDefault(_everyInstanceProperty);
47
47
  var _someInstanceProperty__default = /*#__PURE__*/_interopDefault(_someInstanceProperty);
48
48
  var _valuesInstanceProperty__default = /*#__PURE__*/_interopDefault(_valuesInstanceProperty);
@@ -51,7 +51,7 @@ var _Object$entries__default = /*#__PURE__*/_interopDefault(_Object$entries);
51
51
  var upperFirst__default = /*#__PURE__*/_interopDefault(upperFirst);
52
52
 
53
53
  // NOTE: This string will be replaced on build time with the package version.
54
- var version = "27.10.0";
54
+ var version = "27.11.0";
55
55
 
56
56
  // Permissions
57
57
 
@@ -271,15 +271,29 @@ const useIsAuthorized = _ref => {
271
271
  selectDataFenceData = _ref.selectDataFenceData,
272
272
  _ref$shouldMatchSomeP = _ref.shouldMatchSomePermissions,
273
273
  shouldMatchSomePermissions = _ref$shouldMatchSomeP === void 0 ? false : _ref$shouldMatchSomeP,
274
+ isUserAdminOfCurrentProject = _ref.isUserAdminOfCurrentProject,
274
275
  projectPermissions = _ref.projectPermissions;
275
276
  const impliedPermissions = getImpliedPermissions(demandedPermissions);
276
277
  useWarning(!demandedActionRights || demandedActionRights.length === 1);
277
278
  useWarning(!demandedPermissions || demandedPermissions.length === 1);
278
279
  useWarning();
279
280
  useWarning(!impliedPermissions || impliedPermissions.length === 0, `@commercetools-frontend/permissions: Demanded permissions contain implied permissions. These are implied: ${impliedPermissions.join(', ')}.`);
281
+
282
+ // Check first if we need an "admin" permission check
283
+ const hasDemandedAdministratorPermission = _includesInstanceProperty__default["default"](demandedPermissions).call(demandedPermissions, 'Administrator');
284
+ useWarning(!hasDemandedAdministratorPermission || demandedPermissions.length === 1);
285
+ const hasDemandedAdministratorOfCurrentProjectPermission = _includesInstanceProperty__default["default"](demandedPermissions).call(demandedPermissions, 'AdministratorOfCurrentProject');
286
+ useWarning(!hasDemandedAdministratorOfCurrentProjectPermission || demandedPermissions.length === 1);
287
+ const isAdminOfAnyOrganization = applicationShellConnectors.useApplicationContext(applicationContext => applicationContext.user?.isAdminOfAnyOrganization ?? false);
280
288
  const actualPermissions = applicationShellConnectors.useApplicationContext(applicationContext => projectPermissions?.permissions ?? applicationContext.permissions);
281
289
  const actualActionRights = applicationShellConnectors.useApplicationContext(applicationContext => projectPermissions?.actionRights ?? applicationContext.actionRights);
282
290
  const actualDataFences = applicationShellConnectors.useApplicationContext(applicationContext => projectPermissions?.dataFences ?? applicationContext.dataFences);
291
+ if (hasDemandedAdministratorPermission) {
292
+ return isAdminOfAnyOrganization;
293
+ }
294
+ if (hasDemandedAdministratorOfCurrentProjectPermission) {
295
+ return isUserAdminOfCurrentProject ?? false;
296
+ }
283
297
 
284
298
  // if the user has no permissions and no dataFences assigned to them, they are not authorized
285
299
  if (!actualPermissions && !actualDataFences) return false;
@@ -324,6 +338,7 @@ const Authorized = _ref => {
324
338
  demandedDataFences: props.demandedDataFences,
325
339
  selectDataFenceData: props.selectDataFenceData,
326
340
  shouldMatchSomePermissions: shouldMatchSomePermissions,
341
+ isUserAdminOfCurrentProject: props.isUserAdminOfCurrentProject,
327
342
  projectPermissions: props.projectPermissions
328
343
  });
329
344
  return jsxRuntime.jsx(jsxRuntime.Fragment, {
@@ -368,6 +383,7 @@ const RestrictedByPermissions = props => {
368
383
  demandedActionRights: props.actionRights,
369
384
  demandedDataFences: props.dataFences,
370
385
  selectDataFenceData: props.selectDataFenceData,
386
+ isUserAdminOfCurrentProject: props.isUserAdminOfCurrentProject,
371
387
  projectPermissions: props.projectPermissions,
372
388
  render: isAuthorized => {
373
389
  if (typeof props.children === 'function') return props.children({
@@ -11,12 +11,12 @@ import _Object$defineProperties from '@babel/runtime-corejs3/core-js-stable/obje
11
11
  import _Object$defineProperty from '@babel/runtime-corejs3/core-js-stable/object/define-property';
12
12
  import _defineProperty from '@babel/runtime-corejs3/helpers/esm/defineProperty';
13
13
  import _objectWithoutProperties from '@babel/runtime-corejs3/helpers/esm/objectWithoutProperties';
14
+ import _includesInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/includes';
14
15
  import warning from 'tiny-warning';
15
16
  import { useApplicationContext } from '@commercetools-frontend/application-shell-connectors';
16
17
  import { reportErrorToSentry } from '@commercetools-frontend/sentry';
17
18
  import _slicedToArray from '@babel/runtime-corejs3/helpers/esm/slicedToArray';
18
19
  import _startsWithInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/starts-with';
19
- import _includesInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/includes';
20
20
  import _everyInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/every';
21
21
  import _someInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/some';
22
22
  import _valuesInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/values';
@@ -26,7 +26,7 @@ import upperFirst from 'lodash/upperFirst';
26
26
  import { jsx, Fragment } from '@emotion/react/jsx-runtime';
27
27
 
28
28
  // NOTE: This string will be replaced on build time with the package version.
29
- var version = "27.10.0";
29
+ var version = "27.11.0";
30
30
 
31
31
  // Permissions
32
32
 
@@ -247,15 +247,29 @@ const useIsAuthorized = _ref => {
247
247
  selectDataFenceData = _ref.selectDataFenceData,
248
248
  _ref$shouldMatchSomeP = _ref.shouldMatchSomePermissions,
249
249
  shouldMatchSomePermissions = _ref$shouldMatchSomeP === void 0 ? false : _ref$shouldMatchSomeP,
250
+ isUserAdminOfCurrentProject = _ref.isUserAdminOfCurrentProject,
250
251
  projectPermissions = _ref.projectPermissions;
251
252
  const impliedPermissions = getImpliedPermissions(demandedPermissions);
252
253
  useWarning(!demandedActionRights || demandedActionRights.length === 1, `@commercetools-frontend/permissions: It is recommended to pass a single demanded action right while using the hook, HoC or component multiple times.`);
253
254
  useWarning(!demandedPermissions || demandedPermissions.length === 1, `@commercetools-frontend/permissions: It is recommended to pass a single demanded permission while using the hook, HoC or component multiple times.`);
254
255
  useWarning(shouldMatchSomePermissions === false, `@commercetools-frontend/permissions: It is recommended not to use 'shouldMatchSomePermissions' but instead use the hook, HoC or component multiple times.`);
255
256
  useWarning(!impliedPermissions || impliedPermissions.length === 0, `@commercetools-frontend/permissions: Demanded permissions contain implied permissions. These are implied: ${impliedPermissions.join(', ')}.`);
257
+
258
+ // Check first if we need an "admin" permission check
259
+ const hasDemandedAdministratorPermission = _includesInstanceProperty(demandedPermissions).call(demandedPermissions, 'Administrator');
260
+ useWarning(!hasDemandedAdministratorPermission || demandedPermissions.length === 1, `@commercetools-frontend/permissions: When demanding the "Administrator" permission, no other permissions must be demanded.`);
261
+ const hasDemandedAdministratorOfCurrentProjectPermission = _includesInstanceProperty(demandedPermissions).call(demandedPermissions, 'AdministratorOfCurrentProject');
262
+ useWarning(!hasDemandedAdministratorOfCurrentProjectPermission || demandedPermissions.length === 1, `@commercetools-frontend/permissions: When demanding the "AdministratorOfCurrentProject" permission, no other permissions must be demanded.`);
263
+ const isAdminOfAnyOrganization = useApplicationContext(applicationContext => applicationContext.user?.isAdminOfAnyOrganization ?? false);
256
264
  const actualPermissions = useApplicationContext(applicationContext => projectPermissions?.permissions ?? applicationContext.permissions);
257
265
  const actualActionRights = useApplicationContext(applicationContext => projectPermissions?.actionRights ?? applicationContext.actionRights);
258
266
  const actualDataFences = useApplicationContext(applicationContext => projectPermissions?.dataFences ?? applicationContext.dataFences);
267
+ if (hasDemandedAdministratorPermission) {
268
+ return isAdminOfAnyOrganization;
269
+ }
270
+ if (hasDemandedAdministratorOfCurrentProjectPermission) {
271
+ return isUserAdminOfCurrentProject ?? false;
272
+ }
259
273
 
260
274
  // if the user has no permissions and no dataFences assigned to them, they are not authorized
261
275
  if (!actualPermissions && !actualDataFences) return false;
@@ -300,6 +314,7 @@ const Authorized = _ref => {
300
314
  demandedDataFences: props.demandedDataFences,
301
315
  selectDataFenceData: props.selectDataFenceData,
302
316
  shouldMatchSomePermissions: shouldMatchSomePermissions,
317
+ isUserAdminOfCurrentProject: props.isUserAdminOfCurrentProject,
303
318
  projectPermissions: props.projectPermissions
304
319
  });
305
320
  return jsx(Fragment, {
@@ -344,6 +359,7 @@ const RestrictedByPermissions = props => {
344
359
  demandedActionRights: props.actionRights,
345
360
  demandedDataFences: props.dataFences,
346
361
  selectDataFenceData: props.selectDataFenceData,
362
+ isUserAdminOfCurrentProject: props.isUserAdminOfCurrentProject,
347
363
  projectPermissions: props.projectPermissions,
348
364
  render: isAuthorized => {
349
365
  if (typeof props.children === 'function') return props.children({
@@ -26,6 +26,7 @@ type Props = {
26
26
  demandedDataFences?: TDemandedDataFence[];
27
27
  shouldMatchSomePermissions?: boolean;
28
28
  selectDataFenceData?: TSelectDataFenceData;
29
+ isUserAdminOfCurrentProject?: boolean | null;
29
30
  projectPermissions?: TProjectPermissions;
30
31
  render: (isAuthorized: boolean) => ReactNode;
31
32
  children?: never;
@@ -30,6 +30,7 @@ type Props = {
30
30
  dataFences?: TDemandedDataFence[];
31
31
  selectDataFenceData?: TSelectDataFenceData;
32
32
  unauthorizedComponent?: ComponentType;
33
+ isUserAdminOfCurrentProject?: boolean | null;
33
34
  projectPermissions?: TProjectPermissions;
34
35
  render?: TRenderProp;
35
36
  children?: TRenderProp | ReactNode;
@@ -19,12 +19,13 @@ type TProjectPermissions = {
19
19
  actionRights: TNormalizedActionRights | null;
20
20
  dataFences: TNormalizedDataFences | null;
21
21
  };
22
- declare const useIsAuthorized: ({ demandedPermissions, demandedActionRights, demandedDataFences, selectDataFenceData, shouldMatchSomePermissions, projectPermissions, }: {
22
+ declare const useIsAuthorized: ({ demandedPermissions, demandedActionRights, demandedDataFences, selectDataFenceData, shouldMatchSomePermissions, isUserAdminOfCurrentProject, projectPermissions, }: {
23
23
  demandedPermissions: TPermissionName[];
24
24
  demandedActionRights?: TDemandedActionRight[];
25
25
  demandedDataFences?: TDemandedDataFence[];
26
26
  selectDataFenceData?: TSelectDataFenceData;
27
27
  shouldMatchSomePermissions?: boolean;
28
+ isUserAdminOfCurrentProject?: boolean | null;
28
29
  projectPermissions?: TProjectPermissions;
29
30
  }) => boolean;
30
31
  export default useIsAuthorized;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@commercetools-frontend/permissions",
3
- "version": "27.10.0",
3
+ "version": "27.11.0",
4
4
  "description": "React components to declaratively handle MC permissions",
5
5
  "bugs": "https://github.com/commercetools/merchant-center-application-kit/issues",
6
6
  "repository": {
@@ -38,8 +38,8 @@
38
38
  "prop-types": "15.8.1",
39
39
  "tiny-invariant": "1.3.3",
40
40
  "tiny-warning": "1.0.3",
41
- "@commercetools-frontend/application-shell-connectors": "^27.10.0",
42
- "@commercetools-frontend/sentry": "^27.10.0"
41
+ "@commercetools-frontend/sentry": "^27.11.0",
42
+ "@commercetools-frontend/application-shell-connectors": "^27.11.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/jest": "^29.5.14",