@strapi/plugin-users-permissions 4.0.0-beta.2 → 4.0.0-beta.20

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 (46) hide show
  1. package/admin/src/components/BoundRoute/index.js +23 -27
  2. package/admin/src/components/FormModal/Input/index.js +2 -2
  3. package/admin/src/components/FormModal/index.js +10 -5
  4. package/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js +1 -1
  5. package/admin/src/components/Permissions/PermissionRow/SubCategory.js +12 -10
  6. package/admin/src/components/Permissions/PermissionRow/index.js +1 -1
  7. package/admin/src/components/Permissions/index.js +12 -8
  8. package/admin/src/components/Policies/index.js +12 -9
  9. package/admin/src/components/UsersPermissions/index.js +12 -15
  10. package/admin/src/index.js +0 -8
  11. package/admin/src/pages/AdvancedSettings/index.js +13 -13
  12. package/admin/src/pages/EmailTemplates/components/EmailForm.js +10 -5
  13. package/admin/src/pages/EmailTemplates/components/EmailTable.js +16 -16
  14. package/admin/src/pages/EmailTemplates/index.js +3 -3
  15. package/admin/src/pages/Providers/index.js +21 -21
  16. package/admin/src/pages/Providers/utils/api.js +1 -1
  17. package/admin/src/pages/Roles/CreatePage/index.js +13 -13
  18. package/admin/src/pages/Roles/EditPage/index.js +23 -13
  19. package/admin/src/pages/Roles/ListPage/components/TableBody.js +14 -10
  20. package/admin/src/pages/Roles/ListPage/index.js +19 -25
  21. package/documentation/1.0.0/overrides/users-permissions-User.json +7 -7
  22. package/package.json +29 -30
  23. package/server/bootstrap/index.js +17 -17
  24. package/server/config.js +2 -2
  25. package/server/content-types/permission/index.js +3 -0
  26. package/server/content-types/role/index.js +3 -0
  27. package/server/controllers/auth.js +73 -215
  28. package/server/controllers/{user/admin.js → content-manager-user.js} +44 -75
  29. package/server/controllers/index.js +2 -0
  30. package/server/controllers/role.js +7 -7
  31. package/server/controllers/settings.js +5 -4
  32. package/server/controllers/user.js +118 -28
  33. package/server/controllers/validation/auth.js +29 -0
  34. package/server/controllers/validation/user.js +38 -0
  35. package/server/middlewares/rateLimit.js +1 -1
  36. package/server/routes/admin/role.js +5 -5
  37. package/server/routes/admin/settings.js +6 -6
  38. package/server/routes/content-api/auth.js +5 -7
  39. package/server/services/jwt.js +9 -17
  40. package/server/services/providers.js +13 -10
  41. package/server/services/role.js +5 -10
  42. package/server/services/user.js +8 -6
  43. package/server/services/users-permissions.js +56 -45
  44. package/server/strategies/users-permissions.js +23 -22
  45. package/admin/src/assets/images/logo.svg +0 -1
  46. package/server/controllers/user/api.js +0 -158
@@ -15,14 +15,14 @@ import {
15
15
  import has from 'lodash/has';
16
16
  import upperFirst from 'lodash/upperFirst';
17
17
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
18
- import { HeaderLayout, Layout, ContentLayout } from '@strapi/parts/Layout';
19
- import { Main } from '@strapi/parts/Main';
20
- import { useNotifyAT } from '@strapi/parts/LiveRegions';
21
- import { Table, Thead, Tr, Th, Tbody, Td } from '@strapi/parts/Table';
22
- import { Text, TableLabel } from '@strapi/parts/Text';
23
- import { VisuallyHidden } from '@strapi/parts/VisuallyHidden';
24
- import { IconButton } from '@strapi/parts/IconButton';
25
- import EditIcon from '@strapi/icons/EditIcon';
18
+ import { HeaderLayout, Layout, ContentLayout } from '@strapi/design-system/Layout';
19
+ import { Main } from '@strapi/design-system/Main';
20
+ import { useNotifyAT } from '@strapi/design-system/LiveRegions';
21
+ import { Table, Thead, Tr, Th, Tbody, Td } from '@strapi/design-system/Table';
22
+ import { Typography } from '@strapi/design-system/Typography';
23
+ import { VisuallyHidden } from '@strapi/design-system/VisuallyHidden';
24
+ import { IconButton } from '@strapi/design-system/IconButton';
25
+ import Pencil from '@strapi/icons/Pencil';
26
26
  import { useQuery, useMutation, useQueryClient } from 'react-query';
27
27
  import forms from './utils/forms';
28
28
  import { fetchData, putProvider } from './utils/api';
@@ -167,31 +167,31 @@ export const ProvidersPage = () => {
167
167
  <Thead>
168
168
  <Tr>
169
169
  <Th>
170
- <TableLabel textColor="neutral600">
170
+ <Typography variant="sigma" textColor="neutral600">
171
171
  <VisuallyHidden>
172
172
  {formatMessage({ id: getTrad('Providers.image'), defaultMessage: 'Image' })}
173
173
  </VisuallyHidden>
174
- </TableLabel>
174
+ </Typography>
175
175
  </Th>
176
176
  <Th>
177
- <TableLabel textColor="neutral600">
177
+ <Typography variant="sigma" textColor="neutral600">
178
178
  {formatMessage({ id: getTrad('Providers.name'), defaultMessage: 'Name' })}
179
- </TableLabel>
179
+ </Typography>
180
180
  </Th>
181
181
  <Th>
182
- <TableLabel textColor="neutral600">
182
+ <Typography variant="sigma" textColor="neutral600">
183
183
  {formatMessage({ id: getTrad('Providers.status'), defaultMessage: 'Status' })}
184
- </TableLabel>
184
+ </Typography>
185
185
  </Th>
186
186
  <Th>
187
- <TableLabel>
187
+ <Typography variant="sigma">
188
188
  <VisuallyHidden>
189
189
  {formatMessage({
190
190
  id: getTrad('Providers.settings'),
191
191
  defaultMessage: 'Settings',
192
192
  })}
193
193
  </VisuallyHidden>
194
- </TableLabel>
194
+ </Typography>
195
195
  </Th>
196
196
  </Tr>
197
197
  </Thead>
@@ -208,12 +208,12 @@ export const ProvidersPage = () => {
208
208
  <FontAwesomeIcon icon={provider.icon} />
209
209
  </Td>
210
210
  <Td width="45%">
211
- <Text highlighted textColor="neutral800">
211
+ <Typography fontWeight="semiBold" textColor="neutral800">
212
212
  {provider.name}
213
- </Text>
213
+ </Typography>
214
214
  </Td>
215
215
  <Td width="65%">
216
- <Text
216
+ <Typography
217
217
  textColor={provider.enabled ? 'success600' : 'danger600'}
218
218
  data-testid={`enable-${provider.name}`}
219
219
  >
@@ -226,14 +226,14 @@ export const ProvidersPage = () => {
226
226
  id: getTrad('Providers.disabled'),
227
227
  defaultMessage: 'Disabled',
228
228
  })}
229
- </Text>
229
+ </Typography>
230
230
  </Td>
231
231
  <Td {...stopPropagation}>
232
232
  {canUpdate && (
233
233
  <IconButton
234
234
  onClick={() => handleClickEdit(provider)}
235
235
  noBorder
236
- icon={<EditIcon />}
236
+ icon={<Pencil />}
237
237
  label="Edit"
238
238
  />
239
239
  )}
@@ -18,4 +18,4 @@ export const fetchData = async toggleNotification => {
18
18
 
19
19
  export const putProvider = body => {
20
20
  return axiosInstance.put(getRequestURL('providers'), body);
21
- }
21
+ };
@@ -1,15 +1,15 @@
1
1
  import React, { useState, useRef } from 'react';
2
2
  import { useHistory } from 'react-router-dom';
3
- import { ContentLayout, HeaderLayout } from '@strapi/parts/Layout';
4
- import { Main } from '@strapi/parts/Main';
5
- import { Button } from '@strapi/parts/Button';
6
- import { Stack } from '@strapi/parts/Stack';
7
- import { Box } from '@strapi/parts/Box';
8
- import { TextInput } from '@strapi/parts/TextInput';
9
- import { Textarea } from '@strapi/parts/Textarea';
10
- import { H3 } from '@strapi/parts/Text';
11
- import CheckIcon from '@strapi/icons/CheckIcon';
12
- import { GridItem, Grid } from '@strapi/parts/Grid';
3
+ import { ContentLayout, HeaderLayout } from '@strapi/design-system/Layout';
4
+ import { Main } from '@strapi/design-system/Main';
5
+ import { Button } from '@strapi/design-system/Button';
6
+ import { Stack } from '@strapi/design-system/Stack';
7
+ import { Box } from '@strapi/design-system/Box';
8
+ import { TextInput } from '@strapi/design-system/TextInput';
9
+ import { Textarea } from '@strapi/design-system/Textarea';
10
+ import { Typography } from '@strapi/design-system/Typography';
11
+ import Check from '@strapi/icons/Check';
12
+ import { GridItem, Grid } from '@strapi/design-system/Grid';
13
13
  import { Formik } from 'formik';
14
14
  import { useIntl } from 'react-intl';
15
15
  import {
@@ -84,7 +84,7 @@ const EditPage = () => {
84
84
  <HeaderLayout
85
85
  primaryAction={
86
86
  !isLoadingPlugins && (
87
- <Button type="submit" loading={isSubmitting} startIcon={<CheckIcon />}>
87
+ <Button type="submit" loading={isSubmitting} startIcon={<Check />}>
88
88
  {formatMessage({
89
89
  id: 'app.components.Button.save',
90
90
  defaultMessage: 'Save',
@@ -113,12 +113,12 @@ const EditPage = () => {
113
113
  paddingRight={7}
114
114
  >
115
115
  <Stack size={4}>
116
- <H3 as="h2">
116
+ <Typography variant="delta" as="h2">
117
117
  {formatMessage({
118
118
  id: getTrad('EditPage.form.roles'),
119
119
  defaultMessage: 'Role details',
120
120
  })}
121
- </H3>
121
+ </Typography>
122
122
  <Grid gap={4}>
123
123
  <GridItem col={6}>
124
124
  <TextInput
@@ -1,14 +1,16 @@
1
1
  import React, { useState, useRef } from 'react';
2
- import { ContentLayout, HeaderLayout } from '@strapi/parts/Layout';
3
- import { Main } from '@strapi/parts/Main';
4
- import { Button } from '@strapi/parts/Button';
5
- import { Stack } from '@strapi/parts/Stack';
6
- import { Box } from '@strapi/parts/Box';
7
- import { TextInput } from '@strapi/parts/TextInput';
8
- import { Textarea } from '@strapi/parts/Textarea';
9
- import { H3 } from '@strapi/parts/Text';
10
- import CheckIcon from '@strapi/icons/CheckIcon';
11
- import { GridItem, Grid } from '@strapi/parts/Grid';
2
+ import { ContentLayout, HeaderLayout } from '@strapi/design-system/Layout';
3
+ import { Main } from '@strapi/design-system/Main';
4
+ import { Button } from '@strapi/design-system/Button';
5
+ import { Stack } from '@strapi/design-system/Stack';
6
+ import { Box } from '@strapi/design-system/Box';
7
+ import { TextInput } from '@strapi/design-system/TextInput';
8
+ import { Textarea } from '@strapi/design-system/Textarea';
9
+ import { Typography } from '@strapi/design-system/Typography';
10
+ import ArrowLeft from '@strapi/icons/ArrowLeft';
11
+ import Check from '@strapi/icons/Check';
12
+ import { Link } from '@strapi/design-system/Link';
13
+ import { GridItem, Grid } from '@strapi/design-system/Grid';
12
14
  import { Formik } from 'formik';
13
15
  import { useIntl } from 'react-intl';
14
16
  import { useRouteMatch } from 'react-router-dom';
@@ -92,7 +94,7 @@ const EditPage = () => {
92
94
  disabled={role.code === 'strapi-super-admin'}
93
95
  type="submit"
94
96
  loading={isSubmitting}
95
- startIcon={<CheckIcon />}
97
+ startIcon={<Check />}
96
98
  >
97
99
  {formatMessage({
98
100
  id: 'app.components.Button.save',
@@ -103,6 +105,14 @@ const EditPage = () => {
103
105
  }
104
106
  title={role.name}
105
107
  subtitle={role.description}
108
+ navigationAction={
109
+ <Link startIcon={<ArrowLeft />} to="/settings/users-permissions/roles">
110
+ {formatMessage({
111
+ id: 'app.components.go-back',
112
+ defaultMessage: 'Go back',
113
+ })}
114
+ </Link>
115
+ }
106
116
  />
107
117
  <ContentLayout>
108
118
  <Stack size={7}>
@@ -116,12 +126,12 @@ const EditPage = () => {
116
126
  paddingRight={7}
117
127
  >
118
128
  <Stack size={4}>
119
- <H3 as="h2">
129
+ <Typography variant="delta" as="h2">
120
130
  {formatMessage({
121
131
  id: getTrad('EditPage.form.roles'),
122
132
  defaultMessage: 'Role details',
123
133
  })}
124
- </H3>
134
+ </Typography>
125
135
  <Grid gap={4}>
126
136
  <GridItem col={6}>
127
137
  <TextInput
@@ -1,7 +1,11 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { IconButton, Tbody, Text, Tr, Td, Row } from '@strapi/parts';
4
- import { EditIcon, DeleteIcon } from '@strapi/icons';
3
+ import { IconButton } from '@strapi/design-system/IconButton';
4
+ import { Typography } from '@strapi/design-system/Typography';
5
+ import { Flex } from '@strapi/design-system/Flex';
6
+ import { Tbody, Tr, Td } from '@strapi/design-system/Table';
7
+ import Pencil from '@strapi/icons/Pencil';
8
+ import Trash from '@strapi/icons/Trash';
5
9
  import { CheckPermissions, onRowClick, stopPropagation } from '@strapi/helper-plugin';
6
10
  import { useIntl } from 'react-intl';
7
11
  import { useHistory } from 'react-router-dom';
@@ -30,26 +34,26 @@ const TableBody = ({ sortedRoles, canDelete, permissions, setRoleToDelete, onDel
30
34
  {sortedRoles?.map(role => (
31
35
  <Tr key={role.name} {...onRowClick({ fn: () => handleClickEdit(role.id) })}>
32
36
  <Td width="20%">
33
- <Text>{role.name}</Text>
37
+ <Typography>{role.name}</Typography>
34
38
  </Td>
35
39
  <Td width="50%">
36
- <Text>{role.description}</Text>
40
+ <Typography>{role.description}</Typography>
37
41
  </Td>
38
42
  <Td width="30%">
39
- <Text>
43
+ <Typography>
40
44
  {`${role.nb_users} ${formatMessage({
41
45
  id: getTrad('Roles.users'),
42
46
  defaultMessage: 'users',
43
47
  }).toLowerCase()}`}
44
- </Text>
48
+ </Typography>
45
49
  </Td>
46
50
  <Td>
47
- <Row justifyContent="end" {...stopPropagation}>
51
+ <Flex justifyContent="end" {...stopPropagation}>
48
52
  <CheckPermissions permissions={permissions.updateRole}>
49
53
  <IconButton
50
54
  onClick={() => handleClickEdit(role.id)}
51
55
  noBorder
52
- icon={<EditIcon />}
56
+ icon={<Pencil />}
53
57
  label={formatMessage(
54
58
  { id: 'app.component.table.edit', defaultMessage: 'Edit {target}' },
55
59
  { target: `${role.name}` }
@@ -61,7 +65,7 @@ const TableBody = ({ sortedRoles, canDelete, permissions, setRoleToDelete, onDel
61
65
  <IconButton
62
66
  onClick={() => handleClickDelete(role.id)}
63
67
  noBorder
64
- icon={<DeleteIcon />}
68
+ icon={<Trash />}
65
69
  label={formatMessage(
66
70
  { id: 'app.component.table.delete', defaultMessage: 'Delete {target}' },
67
71
  { target: `${role.name}` }
@@ -69,7 +73,7 @@ const TableBody = ({ sortedRoles, canDelete, permissions, setRoleToDelete, onDel
69
73
  />
70
74
  </CheckPermissions>
71
75
  )}
72
- </Row>
76
+ </Flex>
73
77
  </Td>
74
78
  </Tr>
75
79
  ))}
@@ -1,20 +1,12 @@
1
1
  import React, { useMemo, useState } from 'react';
2
- import {
3
- Button,
4
- HeaderLayout,
5
- Layout,
6
- Main,
7
- Table,
8
- Tr,
9
- Thead,
10
- Th,
11
- TableLabel,
12
- useNotifyAT,
13
- ContentLayout,
14
- ActionLayout,
15
- VisuallyHidden,
16
- } from '@strapi/parts';
17
- import AddIcon from '@strapi/icons/AddIcon';
2
+ import { Button } from '@strapi/design-system/Button';
3
+ import { HeaderLayout, Layout, ContentLayout, ActionLayout } from '@strapi/design-system/Layout';
4
+ import { Main } from '@strapi/design-system/Main';
5
+ import { Table, Tr, Thead, Th } from '@strapi/design-system/Table';
6
+ import { VisuallyHidden } from '@strapi/design-system/VisuallyHidden';
7
+ import { Typography } from '@strapi/design-system/Typography';
8
+ import { useNotifyAT } from '@strapi/design-system/LiveRegions';
9
+ import Plus from '@strapi/icons/Plus';
18
10
  import {
19
11
  useTracking,
20
12
  SettingsPageTitle,
@@ -23,7 +15,8 @@ import {
23
15
  useRBAC,
24
16
  NoPermissions,
25
17
  LoadingIndicatorPage,
26
- Search,
18
+ SearchURLQuery,
19
+ useFocusWhenNavigate,
27
20
  useQueryParams,
28
21
  EmptyStateLayout,
29
22
  ConfirmDialog,
@@ -50,6 +43,7 @@ const RoleListPage = () => {
50
43
  const [showConfirmDelete, setShowConfirmDelete] = useState(false);
51
44
  const [isConfirmButtonLoading, setIsConfirmButtonLoading] = useState(false);
52
45
  const [roleToDelete, setRoleToDelete] = useState();
46
+ useFocusWhenNavigate();
53
47
 
54
48
  const queryClient = useQueryClient();
55
49
 
@@ -137,7 +131,7 @@ const RoleListPage = () => {
137
131
  })}
138
132
  primaryAction={
139
133
  <CheckPermissions permissions={permissions.createRole}>
140
- <Button onClick={handleNewRoleClick} startIcon={<AddIcon />}>
134
+ <Button onClick={handleNewRoleClick} startIcon={<Plus />} size="L">
141
135
  {formatMessage({
142
136
  id: getTrad('List.button.roles'),
143
137
  defaultMessage: 'Add new role',
@@ -149,7 +143,7 @@ const RoleListPage = () => {
149
143
 
150
144
  <ActionLayout
151
145
  startActions={
152
- <Search
146
+ <SearchURLQuery
153
147
  label={formatMessage({
154
148
  id: 'app.component.search.label',
155
149
  defaultMessage: 'Search',
@@ -166,25 +160,25 @@ const RoleListPage = () => {
166
160
  <Thead>
167
161
  <Tr>
168
162
  <Th>
169
- <TableLabel textColor="neutral600">
163
+ <Typography variant="sigma" textColor="neutral600">
170
164
  {formatMessage({ id: getTrad('Roles.name'), defaultMessage: 'Name' })}
171
- </TableLabel>
165
+ </Typography>
172
166
  </Th>
173
167
  <Th>
174
- <TableLabel textColor="neutral600">
168
+ <Typography variant="sigma" textColor="neutral600">
175
169
  {formatMessage({
176
170
  id: getTrad('Roles.description'),
177
171
  defaultMessage: 'Description',
178
172
  })}
179
- </TableLabel>
173
+ </Typography>
180
174
  </Th>
181
175
  <Th>
182
- <TableLabel textColor="neutral600">
176
+ <Typography variant="sigma" textColor="neutral600">
183
177
  {formatMessage({
184
178
  id: getTrad('Roles.users'),
185
179
  defaultMessage: 'Users',
186
180
  })}
187
- </TableLabel>
181
+ </Typography>
188
182
  </Th>
189
183
  <Th>
190
184
  <VisuallyHidden>
@@ -6,7 +6,7 @@
6
6
  "security": [],
7
7
  "externalDocs": {
8
8
  "description": "Find out more in the strapi's documentation",
9
- "url": "https://strapi.io/documentation/developer-docs/latest/development/plugins/users-permissions.html#registration"
9
+ "url": "https://docs.strapi.io/developer-docs/latest/plugins/users-permissions.html#registration"
10
10
  },
11
11
  "responses": {
12
12
  "200": {
@@ -58,7 +58,7 @@
58
58
  "security": [],
59
59
  "externalDocs": {
60
60
  "description": "Find out more in the strapi's documentation",
61
- "url": "https://strapi.io/documentation/developer-docs/latest/development/plugins/users-permissions.html#email-validation"
61
+ "url": "https://docs.strapi.io/developer-docs/latest/plugins/users-permissions.html#email-validation"
62
62
  },
63
63
  "responses": {
64
64
  "200": {
@@ -130,7 +130,7 @@
130
130
  ],
131
131
  "externalDocs": {
132
132
  "description": "Find out more about the authentication flow in the strapi documentation",
133
- "url": "https://strapi.io/documentation/developer-docs/latest/development/plugins/users-permissions.html#setting-up-the-provider-examples"
133
+ "url": "https://docs.strapi.io/developer-docs/latest/plugins/users-permissions.html#providers"
134
134
  },
135
135
  "responses": {
136
136
  "200": {
@@ -143,7 +143,7 @@
143
143
  "post": {
144
144
  "externalDocs": {
145
145
  "description": "Find out more in the strapi's documentation",
146
- "url": "https://strapi.io/documentation/developer-docs/latest/development/plugins/users-permissions.html#login"
146
+ "url": "https://docs.strapi.io/developer-docs/latest/plugins/users-permissions.html#login"
147
147
  },
148
148
  "tags": ["Authentication"],
149
149
  "security": [],
@@ -188,7 +188,7 @@
188
188
  "tags": ["Authentication"],
189
189
  "externalDocs": {
190
190
  "description": "Find out more in the strapi's documentation",
191
- "url": "https://strapi.io/documentation/developer-docs/latest/development/plugins/users-permissions.html#setting-up-the-provider-examples"
191
+ "url": "https://docs.strapi.io/developer-docs/latest/plugins/users-permissions.html#providers"
192
192
  },
193
193
  "parameters": [
194
194
  {
@@ -223,7 +223,7 @@
223
223
  "summary": "Send an email to reset your password",
224
224
  "externalDocs": {
225
225
  "description": "Find out more in the strapi's documentation",
226
- "url": "https://strapi.io/documentation/developer-docs/latest/development/plugins/users-permissions.html#forgotten-reset-password"
226
+ "url": "https://docs.strapi.io/developer-docs/latest/plugins/users-permissions.html#forgotten-reset-password"
227
227
  },
228
228
  "requestBody": {
229
229
  "description": "",
@@ -315,7 +315,7 @@
315
315
  "description": "All the routes related to the authentication",
316
316
  "externalDocs": {
317
317
  "description": "Find out more in strapi's documentation",
318
- "url": "https://strapi.io/documentation/developer-docs/latest/development/plugins/users-permissions.html"
318
+ "url": "https://docs.strapi.io/developer-docs/latest/plugins/users-permissions.html"
319
319
  }
320
320
  },
321
321
  {
package/package.json CHANGED
@@ -1,23 +1,32 @@
1
1
  {
2
2
  "name": "@strapi/plugin-users-permissions",
3
- "version": "4.0.0-beta.2",
3
+ "version": "4.0.0-beta.20",
4
4
  "description": "Protect your API with a full-authentication process based on JWT",
5
- "strapi": {
6
- "displayName": "Roles & Permissions",
7
- "name": "users-permissions",
8
- "icon": "users",
9
- "description": "users-permissions.plugin.description",
10
- "required": true,
11
- "kind": "plugin"
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git://github.com/strapi/strapi.git"
8
+ },
9
+ "license": "SEE LICENSE IN LICENSE",
10
+ "author": {
11
+ "name": "Strapi Solutions SAS",
12
+ "email": "hi@strapi.io",
13
+ "url": "https://strapi.io"
12
14
  },
15
+ "maintainers": [
16
+ {
17
+ "name": "Strapi Solutions SAS",
18
+ "email": "hi@strapi.io",
19
+ "url": "https://strapi.io"
20
+ }
21
+ ],
13
22
  "scripts": {
14
23
  "test": "echo \"no tests yet\""
15
24
  },
16
25
  "dependencies": {
17
26
  "@purest/providers": "^1.0.2",
18
- "@strapi/helper-plugin": "4.0.0-beta.2",
19
- "@strapi/utils": "4.0.0-beta.2",
20
- "bcryptjs": "^2.4.3",
27
+ "@strapi/helper-plugin": "4.0.0-beta.20",
28
+ "@strapi/utils": "4.0.0-beta.20",
29
+ "bcryptjs": "2.4.3",
21
30
  "grant-koa": "5.4.8",
22
31
  "jsonwebtoken": "^8.1.0",
23
32
  "koa2-ratelimit": "^0.9.0",
@@ -29,34 +38,24 @@
29
38
  "react-redux": "7.2.3",
30
39
  "react-router": "^5.2.0",
31
40
  "react-router-dom": "5.2.0",
32
- "reactstrap": "8.4.1",
33
41
  "redux-saga": "^0.16.0",
34
42
  "request": "^2.83.0",
43
+ "url-join": "4.0.1",
35
44
  "uuid": "^3.1.0"
36
45
  },
37
46
  "devDependencies": {
38
47
  "koa": "^2.13.1"
39
48
  },
40
- "author": {
41
- "name": "Strapi team",
42
- "email": "hi@strapi.io",
43
- "url": "https://strapi.io"
44
- },
45
- "maintainers": [
46
- {
47
- "name": "Strapi team",
48
- "email": "hi@strapi.io",
49
- "url": "https://strapi.io"
50
- }
51
- ],
52
- "repository": {
53
- "type": "git",
54
- "url": "git://github.com/strapi/strapi.git"
55
- },
56
49
  "engines": {
57
50
  "node": ">=12.x.x <=16.x.x",
58
51
  "npm": ">=6.0.0"
59
52
  },
60
- "license": "SEE LICENSE IN LICENSE",
61
- "gitHead": "020680cbb38b6281b3e16df264b9388a087b2b49"
53
+ "strapi": {
54
+ "displayName": "Roles & Permissions",
55
+ "name": "users-permissions",
56
+ "description": "Protect your API with a full authentication process based on JWT. This plugin comes also with an ACL strategy that allows you to manage the permissions between the groups of users.",
57
+ "required": true,
58
+ "kind": "plugin"
59
+ },
60
+ "gitHead": "b4993dab9f6dbc583709167f459b6f00e0b4baa6"
62
61
  }