@commercetools-frontend/permissions 0.0.0-CRAFT-1791-20251006162610

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) commercetools GmbH
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # @commercetools-frontend/permissions
2
+
3
+ <p align="center">
4
+ <a href="https://www.npmjs.com/package/@commercetools-frontend/permissions"><img src="https://badgen.net/npm/v/@commercetools-frontend/permissions" alt="Latest release (latest dist-tag)" /></a> <a href="https://www.npmjs.com/package/@commercetools-frontend/permissions"><img src="https://badgen.net/npm/v/@commercetools-frontend/permissions/next" alt="Latest release (next dist-tag)" /></a> <a href="https://bundlephobia.com/result?p=@commercetools-frontend/permissions"><img src="https://badgen.net/bundlephobia/minzip/@commercetools-frontend/permissions" alt="Minified + GZipped size" /></a> <a href="https://github.com/commercetools/merchant-center-application-kit/blob/main/LICENSE"><img src="https://badgen.net/github/license/commercetools/merchant-center-application-kit" alt="GitHub license" /></a>
5
+ </p>
6
+
7
+ Check out the [documentation](https://docs.commercetools.com/merchant-center-customizations/api-reference/commercetools-frontend-permissions) for more information.
@@ -0,0 +1,2 @@
1
+ export * from "./declarations/src/index.js";
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVyY2V0b29scy1mcm9udGVuZC1wZXJtaXNzaW9ucy5janMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4vZGVjbGFyYXRpb25zL3NyYy9pbmRleC5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBIn0=
@@ -0,0 +1,430 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var react = require('react');
6
+ var isNil = require('lodash/isNil');
7
+ var invariant = require('tiny-invariant');
8
+ var _Object$keys = require('@babel/runtime-corejs3/core-js-stable/object/keys');
9
+ var _Object$getOwnPropertySymbols = require('@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols');
10
+ var _filterInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/filter');
11
+ var _Object$getOwnPropertyDescriptor = require('@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor');
12
+ var _forEachInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/for-each');
13
+ var _Object$getOwnPropertyDescriptors = require('@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors');
14
+ var _Object$defineProperties = require('@babel/runtime-corejs3/core-js-stable/object/define-properties');
15
+ var _Object$defineProperty = require('@babel/runtime-corejs3/core-js-stable/object/define-property');
16
+ var _defineProperty = require('@babel/runtime-corejs3/helpers/defineProperty');
17
+ var _objectWithoutProperties = require('@babel/runtime-corejs3/helpers/objectWithoutProperties');
18
+ var warning = require('tiny-warning');
19
+ var applicationShellConnectors = require('@commercetools-frontend/application-shell-connectors');
20
+ var sentry = require('@commercetools-frontend/sentry');
21
+ var _slicedToArray = require('@babel/runtime-corejs3/helpers/slicedToArray');
22
+ 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
+ var _everyInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/every');
25
+ var _someInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/some');
26
+ var _valuesInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/values');
27
+ var _findInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/find');
28
+ var _Object$entries = require('@babel/runtime-corejs3/core-js-stable/object/entries');
29
+ var upperFirst = require('lodash/upperFirst');
30
+ var jsxRuntime = require('@emotion/react/jsx-runtime');
31
+
32
+ function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
33
+
34
+ var isNil__default = /*#__PURE__*/_interopDefault(isNil);
35
+ var invariant__default = /*#__PURE__*/_interopDefault(invariant);
36
+ var _Object$keys__default = /*#__PURE__*/_interopDefault(_Object$keys);
37
+ var _Object$getOwnPropertySymbols__default = /*#__PURE__*/_interopDefault(_Object$getOwnPropertySymbols);
38
+ var _filterInstanceProperty__default = /*#__PURE__*/_interopDefault(_filterInstanceProperty);
39
+ var _Object$getOwnPropertyDescriptor__default = /*#__PURE__*/_interopDefault(_Object$getOwnPropertyDescriptor);
40
+ var _forEachInstanceProperty__default = /*#__PURE__*/_interopDefault(_forEachInstanceProperty);
41
+ var _Object$getOwnPropertyDescriptors__default = /*#__PURE__*/_interopDefault(_Object$getOwnPropertyDescriptors);
42
+ var _Object$defineProperties__default = /*#__PURE__*/_interopDefault(_Object$defineProperties);
43
+ var _Object$defineProperty__default = /*#__PURE__*/_interopDefault(_Object$defineProperty);
44
+ var warning__default = /*#__PURE__*/_interopDefault(warning);
45
+ var _startsWithInstanceProperty__default = /*#__PURE__*/_interopDefault(_startsWithInstanceProperty);
46
+ var _includesInstanceProperty__default = /*#__PURE__*/_interopDefault(_includesInstanceProperty);
47
+ var _everyInstanceProperty__default = /*#__PURE__*/_interopDefault(_everyInstanceProperty);
48
+ var _someInstanceProperty__default = /*#__PURE__*/_interopDefault(_someInstanceProperty);
49
+ var _valuesInstanceProperty__default = /*#__PURE__*/_interopDefault(_valuesInstanceProperty);
50
+ var _findInstanceProperty__default = /*#__PURE__*/_interopDefault(_findInstanceProperty);
51
+ var _Object$entries__default = /*#__PURE__*/_interopDefault(_Object$entries);
52
+ var upperFirst__default = /*#__PURE__*/_interopDefault(upperFirst);
53
+
54
+ // NOTE: This string will be replaced on build time with the package version.
55
+ var version = "24.7.2";
56
+
57
+ // Permissions
58
+
59
+ // Action rights
60
+
61
+ // Data fences
62
+
63
+ // Potentially a union type.
64
+
65
+ // Build the permission key from the definition to match it to the format coming from the API.
66
+ const toCanCase = permissionName => `can${permissionName}`;
67
+ const getIsViewPermission = demandedPermission => _startsWithInstanceProperty__default["default"](demandedPermission).call(demandedPermission, 'View');
68
+ const toManageCase = permissionName => permissionName.replace('View', 'Manage');
69
+
70
+ // Check that the user permissions match EXACTLY the required permission.
71
+ // The shapes of the arguments are:
72
+ // - demandedPermission:
73
+ // 'ViewProducts'
74
+ // - actualPermissions:
75
+ // { canViewProducts: true, canManageOrders: false }
76
+ const hasExactPermission = (demandedPermission, actualPermissions) => actualPermissions[toCanCase(demandedPermission)];
77
+ const getInferredManagePermission = (demandedPermission, actualPermissions) => actualPermissions[toCanCase(toManageCase(demandedPermission))];
78
+
79
+ // Check that the user permissions match the required MANAGE permission.
80
+ // The shapes of the arguments are:
81
+ // - demandedPermission:
82
+ // 'ViewProducts'
83
+ // - actualPermissions:
84
+ // { canViewProducts: true, canManageOrders: false }
85
+ const doesManagePermissionInferViewPermission = (demandedPermission, actualPermissions) => {
86
+ const isDemandedPermissionViewPermission = getIsViewPermission(demandedPermission);
87
+ const isViewPermissionInferredByManagePermission = Boolean(getInferredManagePermission(demandedPermission, actualPermissions));
88
+ return isDemandedPermissionViewPermission && isViewPermissionInferredByManagePermission;
89
+ };
90
+
91
+ // Check if the demanded permissions contain any unnecessary
92
+ // implied permissions.
93
+ // E.g. ViewCustomerGroup is implied by ManageCustomerGroup.
94
+ const getImpliedPermissions = permissions => {
95
+ const viewPermissions = _filterInstanceProperty__default["default"](permissions).call(permissions, permission => _startsWithInstanceProperty__default["default"](permission).call(permission, 'View'));
96
+ const impliedPermissions = _filterInstanceProperty__default["default"](viewPermissions).call(viewPermissions, viewPermission => _includesInstanceProperty__default["default"](permissions).call(permissions, toManageCase(viewPermission)));
97
+ return impliedPermissions;
98
+ };
99
+
100
+ // Check the user permissions using one of the defined matchers.
101
+ // The shapes of the arguments are:
102
+ // - demandedPermission:
103
+ // 'ViewProducts'
104
+ // - actualPermissions:
105
+ // { canViewProducts: true, canManageOrders: false }
106
+ // NOTE: in case the `actualPermissions` are not defined, fall back to an empty object.
107
+ // This might be the case when the permissions for a user/project could not be loaded
108
+ // (e.g. project not found).
109
+ const hasPermission = (demandedPermission, actualPermissions) =>
110
+ // First checking the existence of the exact permission
111
+ hasExactPermission(demandedPermission, actualPermissions || {}) ||
112
+ // Then checking if a view permission is inferred as a manage permission
113
+ doesManagePermissionInferViewPermission(demandedPermission, actualPermissions || {});
114
+
115
+ // Check the user action rights using one of the defined matchers.
116
+ // The shapes of the arguments are:
117
+ // - demandedActionRight:
118
+ // '{ group: 'products', name: 'editPrices' }'
119
+ // - actualActionRights:
120
+ // { orders: { canEditPrices: false }, products: { canEditPrices: true } }
121
+ const hasActionRight = (demandedActionRight, actualActionRights) => {
122
+ const actionRightGroup = actualActionRights && actualActionRights[demandedActionRight.group];
123
+ return Boolean(actionRightGroup && actionRightGroup[toCanCase(demandedActionRight.name)]);
124
+ };
125
+
126
+ // Check that the user permissions match EVERY one of the required permissions.
127
+ // The shapes of the arguments are:
128
+ // - demandedPermissions:
129
+ // ['ViewProducts', 'ManageOrders']
130
+ // - actualPermissions:
131
+ // { canViewProducts: true, canManageOrders: false }
132
+ const hasEveryPermissions = (demandedPermissions, actualPermissions) => _everyInstanceProperty__default["default"](demandedPermissions).call(demandedPermissions, permission => hasPermission(permission, actualPermissions));
133
+
134
+ // Check that the user action rights match EVERY one of the required action rights.
135
+ // The shapes of the arguments are:
136
+ // - demandedActionRights:
137
+ // [
138
+ // { group: 'products', name: 'editPrices' },
139
+ // { group: 'products', name: 'publishProducts' },
140
+ // ]
141
+ // - actualActionRights:
142
+ // { products: { canEditPrices: true, canPublishProducts: true } }
143
+ const hasEveryActionRight = (demandedActionRights, actualActionRights) => _everyInstanceProperty__default["default"](demandedActionRights).call(demandedActionRights, actionRight => hasActionRight(actionRight, actualActionRights));
144
+
145
+ // Check that the user permissions match SOME one of the required permissions.
146
+ // The shapes of the arguments are:
147
+ // - demandedPermissions:
148
+ // ['ViewProducts', 'ManageOrders']
149
+ // - actualPermissions:
150
+ // { canViewProducts: true, canManageOrders: false }
151
+ const hasSomePermissions = (demandedPermissions, actualPermissions) => _someInstanceProperty__default["default"](demandedPermissions).call(demandedPermissions, permission => hasPermission(permission, actualPermissions));
152
+ const getHasDemandedDataFence = options => {
153
+ if (!options.selectDataFenceData) return false;
154
+ const hasDemandedPermission = hasPermission(options.demandedDataFence.name, {
155
+ [options.actualDataFence.name]: true
156
+ });
157
+ if (!hasDemandedPermission) return false;
158
+ const selectedDataFenceData = options.selectDataFenceData({
159
+ type: options.demandedDataFence.type,
160
+ group: options.demandedDataFence.group,
161
+ name: options.demandedDataFence.name,
162
+ actualDataFenceValues: _valuesInstanceProperty__default["default"](options.actualDataFence.dataFenceValue)
163
+ });
164
+ if (!selectedDataFenceData) {
165
+ sentry.reportErrorToSentry(new Error(`missing mapper for type "${options.demandedDataFence.type}"`), {
166
+ extra: options.demandedDataFence.type
167
+ });
168
+ return false;
169
+ }
170
+
171
+ // it is enough to only have a subset of demanded dataFence data belonging to actual dataFence values
172
+ return _someInstanceProperty__default["default"](selectedDataFenceData).call(selectedDataFenceData, value => {
173
+ var _context;
174
+ return _includesInstanceProperty__default["default"](_context = _valuesInstanceProperty__default["default"](options.actualDataFence.dataFenceValue)).call(_context, value);
175
+ });
176
+ };
177
+ const getDataFenceByTypeAndGroup = (actualDataFences, demandedDataFenceType, demandedDataFenceGroup) => {
178
+ if (!actualDataFences) return null;
179
+ if (demandedDataFenceType in actualDataFences) {
180
+ switch (demandedDataFenceType) {
181
+ case 'store':
182
+ {
183
+ const actualDataFence = actualDataFences[demandedDataFenceType];
184
+ if (actualDataFence && demandedDataFenceGroup in actualDataFence) {
185
+ return actualDataFence[demandedDataFenceGroup];
186
+ }
187
+ break;
188
+ }
189
+ }
190
+ }
191
+ return null;
192
+ };
193
+ const getIsPermissionOverwritingDataFence = (actualPermissions, demandedDataFence) => {
194
+ if (!actualPermissions) return false;
195
+
196
+ /**
197
+ * NOTE:
198
+ * A data fence relates, exists in relation to a general permission.
199
+ * This relation is constructed by the group of the data fence.
200
+ *
201
+ * Given the user already has manage access on the data fence's group
202
+ * Then the data fence is overruled by it.
203
+ * Given the user _does not_ have manage access on the data fence's group
204
+ * Then the data fence itself takes precedence
205
+ */
206
+ const demandedPermissionByDataFence = `Manage${upperFirst__default["default"](demandedDataFence.group)}`;
207
+ if (hasExactPermission(demandedPermissionByDataFence, actualPermissions)) return true;
208
+ return false;
209
+ };
210
+ const hasSomeDataFence = options => {
211
+ var _context2;
212
+ // Datafences applied should be combined with an OR, that is why we use
213
+ // `some` and not `every`
214
+ return _someInstanceProperty__default["default"](_context2 = options.demandedDataFences).call(_context2, demandedDataFence => {
215
+ var _context3;
216
+ // Given that dataFence structure on `applicationContext`, we get the value by a path
217
+ // e.g given dataFence with { store: { orders: { canManageOrders: { values: } } } }
218
+ // we read the dataFence by the [type] and [group]
219
+ // dataFence[type][group] = dataFence.store.group
220
+ // with value = there is a dataFence to apply, overrules `hasDemandedProjectPermissions`
221
+ // without value = there is no dataFence to apply, overruled by `hasDemandedProjectPermissions`
222
+ const actualDataFenceByTypeAndGroup = getDataFenceByTypeAndGroup(options.actualDataFences, demandedDataFence.type, demandedDataFence.group);
223
+ if (!actualDataFenceByTypeAndGroup) return false;
224
+
225
+ // we try to find if the demanded dataFence is available inside the actual datafences
226
+ const specificActualDataFence = _findInstanceProperty__default["default"](_context3 = _Object$entries__default["default"](actualDataFenceByTypeAndGroup)).call(_context3, _ref => {
227
+ let _ref2 = _slicedToArray(_ref, 2),
228
+ dataFenceName = _ref2[0],
229
+ dataFenceValue = _ref2[1];
230
+ // Either the manage permission matches or the
231
+ // a demanded view permission is implied by a manage permission.
232
+ const doesDataFenceMatchByName = dataFenceName === toCanCase(demandedDataFence.name) || dataFenceName === toCanCase(toManageCase(demandedDataFence.name));
233
+ const doesDataFenceHaveValue = Boolean(dataFenceValue);
234
+ return doesDataFenceMatchByName && doesDataFenceHaveValue;
235
+ });
236
+ if (!specificActualDataFence) return false;
237
+ const _specificActualDataFe = _slicedToArray(specificActualDataFence, 2),
238
+ dataFenceName = _specificActualDataFe[0],
239
+ dataFenceValue = _specificActualDataFe[1];
240
+ const actualDataFence = {
241
+ name: dataFenceName,
242
+ // we do the type casting because at this point we are sure that
243
+ // specificActualDataFence.dataFenceValue is not null
244
+ dataFenceValue: dataFenceValue
245
+ };
246
+ const isPermissionOverwritingDataFence = getIsPermissionOverwritingDataFence(options.actualPermissions, demandedDataFence);
247
+ const hasDemandedDataFence = getHasDemandedDataFence({
248
+ actualDataFence,
249
+ demandedDataFence,
250
+ selectDataFenceData: options.selectDataFenceData
251
+ });
252
+ return !isPermissionOverwritingDataFence && hasDemandedDataFence;
253
+ });
254
+ };
255
+
256
+ // Permissions
257
+
258
+ // Action rights
259
+
260
+ // Data fences
261
+
262
+ // Log a warning only once, and not on each render.
263
+ const useWarning = (condition, message) => {
264
+ react.useEffect(() => {
265
+ process.env.NODE_ENV !== "production" ? warning__default["default"](condition, message) : void 0;
266
+ // eslint-disable-next-line react-hooks/exhaustive-deps
267
+ }, []);
268
+ };
269
+ const useIsAuthorized = _ref => {
270
+ let demandedPermissions = _ref.demandedPermissions,
271
+ demandedActionRights = _ref.demandedActionRights,
272
+ demandedDataFences = _ref.demandedDataFences,
273
+ selectDataFenceData = _ref.selectDataFenceData,
274
+ _ref$shouldMatchSomeP = _ref.shouldMatchSomePermissions,
275
+ shouldMatchSomePermissions = _ref$shouldMatchSomeP === void 0 ? false : _ref$shouldMatchSomeP,
276
+ projectPermissions = _ref.projectPermissions;
277
+ const impliedPermissions = getImpliedPermissions(demandedPermissions);
278
+ 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
+ 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
+ useWarning(shouldMatchSomePermissions === false, `@commercetools-frontend/permissions: It is recommended not to use 'shouldMatchSomePermissions' but instead use the hook, HoC or component multiple times.`);
281
+ useWarning(!impliedPermissions || impliedPermissions.length === 0, `@commercetools-frontend/permissions: Demanded permissions contain implied permissions. These are implied: ${impliedPermissions.join(', ')}.`);
282
+ const actualPermissions = applicationShellConnectors.useApplicationContext(applicationContext => projectPermissions?.permissions ?? applicationContext.permissions);
283
+ const actualActionRights = applicationShellConnectors.useApplicationContext(applicationContext => projectPermissions?.actionRights ?? applicationContext.actionRights);
284
+ const actualDataFences = applicationShellConnectors.useApplicationContext(applicationContext => projectPermissions?.dataFences ?? applicationContext.dataFences);
285
+
286
+ // if the user has no permissions and no dataFences assigned to them, they are not authorized
287
+ if (!actualPermissions && !actualDataFences) return false;
288
+ let hasDemandedDataFences = false;
289
+ if (demandedDataFences && demandedDataFences.length > 0) {
290
+ if (!selectDataFenceData) {
291
+ sentry.reportErrorToSentry(new Error(`@commercetools-frontend/permissions/Authorized: Missing data fences selector "selectDataFenceData".`));
292
+ }
293
+ hasDemandedDataFences = hasSomeDataFence({
294
+ actualPermissions,
295
+ demandedDataFences,
296
+ actualDataFences,
297
+ selectDataFenceData
298
+ });
299
+ }
300
+ const hasDemandedPermissions = shouldMatchSomePermissions ? hasSomePermissions(demandedPermissions, actualPermissions) : hasEveryPermissions(demandedPermissions, actualPermissions);
301
+ const hasDemandedActionRights = hasEveryActionRight(demandedActionRights || [], actualActionRights);
302
+ return hasDemandedDataFences || hasDemandedPermissions && hasDemandedActionRights;
303
+ };
304
+
305
+ // From https://github.com/acdlite/recompose/blob/master/src/packages/recompose/getDisplayName.js
306
+ const getDisplayName = Component => {
307
+ if (typeof Component === 'string') {
308
+ return Component;
309
+ }
310
+ if (!Component) {
311
+ return undefined;
312
+ }
313
+ return Component.displayName || Component.name || 'Component';
314
+ };
315
+
316
+ const _excluded = ["shouldMatchSomePermissions"];
317
+ function ownKeys$1(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
318
+ function _objectSpread$1(e) { for (var r = 1; r < arguments.length; r++) { var _context, _context2; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context = ownKeys$1(Object(t), !0)).call(_context, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context2 = ownKeys$1(Object(t))).call(_context2, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
319
+ const Authorized = _ref => {
320
+ let _ref$shouldMatchSomeP = _ref.shouldMatchSomePermissions,
321
+ shouldMatchSomePermissions = _ref$shouldMatchSomeP === void 0 ? false : _ref$shouldMatchSomeP,
322
+ props = _objectWithoutProperties(_ref, _excluded);
323
+ const isAuthorized = useIsAuthorized({
324
+ demandedPermissions: props.demandedPermissions,
325
+ demandedActionRights: props.demandedActionRights,
326
+ demandedDataFences: props.demandedDataFences,
327
+ selectDataFenceData: props.selectDataFenceData,
328
+ shouldMatchSomePermissions: shouldMatchSomePermissions,
329
+ projectPermissions: props.projectPermissions
330
+ });
331
+ return jsxRuntime.jsx(jsxRuntime.Fragment, {
332
+ children: props.render(isAuthorized)
333
+ });
334
+ };
335
+ Authorized.displayName = 'Authorized';
336
+ const injectAuthorized = function (demandedPermissions) {
337
+ let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
338
+ let propName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'isAuthorized';
339
+ return Component => {
340
+ const WrappedComponent = props => jsxRuntime.jsx(Authorized, {
341
+ shouldMatchSomePermissions: options.shouldMatchSomePermissions,
342
+ demandedPermissions: demandedPermissions,
343
+ demandedActionRights: options.actionRights,
344
+ demandedDataFences: options.dataFences,
345
+ selectDataFenceData: options.getSelectDataFenceData && options.getSelectDataFenceData(props),
346
+ render: isAuthorized =>
347
+ // @ts-ignore: relates to https://github.com/emotion-js/emotion/issues/3245
348
+ jsxRuntime.jsx(Component, _objectSpread$1(_objectSpread$1({}, props), {}, {
349
+ [propName]: isAuthorized
350
+ }))
351
+ });
352
+ WrappedComponent.displayName = `withUserPermissions(${getDisplayName(Component)})`;
353
+ return WrappedComponent;
354
+ };
355
+ };
356
+
357
+ const getHasChildren = children => react.Children.count(children) > 0;
358
+
359
+ // Permissions
360
+
361
+ // Action rights
362
+
363
+ // Data fences
364
+
365
+ const RestrictedByPermissions = props => {
366
+ !!(typeof props.children === 'function' && !isNil__default["default"](props.unauthorizedComponent)) ? process.env.NODE_ENV !== "production" ? invariant__default["default"](false, '@commercetools-frontend/permissions/RestrictedByPermissions: You provided both `children` and `unauthorizedComponent`. Please provide only one of them.') : invariant__default["default"](false) : void 0;
367
+ return jsxRuntime.jsx(Authorized, {
368
+ shouldMatchSomePermissions: props.shouldMatchSomePermissions,
369
+ demandedPermissions: props.permissions,
370
+ demandedActionRights: props.actionRights,
371
+ demandedDataFences: props.dataFences,
372
+ selectDataFenceData: props.selectDataFenceData,
373
+ projectPermissions: props.projectPermissions,
374
+ render: isAuthorized => {
375
+ if (typeof props.children === 'function') return props.children({
376
+ isAuthorized
377
+ });
378
+ if (typeof props.render === 'function') return props.render({
379
+ isAuthorized
380
+ });
381
+ if (isAuthorized) {
382
+ if (props.children && getHasChildren(props.children)) return react.Children.only(props.children);
383
+ } else if (!isAuthorized) {
384
+ if (props.unauthorizedComponent) {
385
+ return /*#__PURE__*/react.createElement(props.unauthorizedComponent);
386
+ }
387
+ }
388
+ return null;
389
+ }
390
+ });
391
+ };
392
+ RestrictedByPermissions.displayName = 'RestrictedByPermissions';
393
+
394
+ function ownKeys(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
395
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context, _context2; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context = ownKeys(Object(t), !0)).call(_context, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context2 = ownKeys(Object(t))).call(_context2, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
396
+ const branchOnPermissions = function (demandedPermissions, FallbackComponent) {
397
+ let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
398
+ shouldMatchSomePermissions: false
399
+ };
400
+ return Component => {
401
+ const WrappedComponent = props => jsxRuntime.jsx(Authorized, {
402
+ shouldMatchSomePermissions: options.shouldMatchSomePermissions,
403
+ demandedPermissions: demandedPermissions,
404
+ demandedActionRights: options.actionRights,
405
+ demandedDataFences: options.dataFences,
406
+ selectDataFenceData: options.getSelectDataFenceData && options.getSelectDataFenceData(props),
407
+ render: isAuthorized => {
408
+ if (isAuthorized) {
409
+ // @ts-ignore: relates to https://github.com/emotion-js/emotion/issues/3245
410
+ return jsxRuntime.jsx(Component, _objectSpread({}, props));
411
+ }
412
+ if (FallbackComponent) {
413
+ return jsxRuntime.jsx(FallbackComponent, {});
414
+ }
415
+ return jsxRuntime.jsx(jsxRuntime.Fragment, {});
416
+ }
417
+ });
418
+ WrappedComponent.displayName = `branchOnPermissions(${getDisplayName(Component)})`;
419
+ return WrappedComponent;
420
+ };
421
+ };
422
+
423
+ exports.Authorized = Authorized;
424
+ exports.RestrictedByPermissions = RestrictedByPermissions;
425
+ exports.branchOnPermissions = branchOnPermissions;
426
+ exports.hasEveryPermissions = hasEveryPermissions;
427
+ exports.hasSomePermissions = hasSomePermissions;
428
+ exports.injectAuthorized = injectAuthorized;
429
+ exports.useIsAuthorized = useIsAuthorized;
430
+ exports.version = version;
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ if (process.env.NODE_ENV === "production") {
4
+ module.exports = require("./commercetools-frontend-permissions.cjs.prod.js");
5
+ } else {
6
+ module.exports = require("./commercetools-frontend-permissions.cjs.dev.js");
7
+ }