',
+ },
+ ],
+ [
+ 'vuepress-plugin-container',
+ {
+ type: 'prerequisites',
+ defaultTitle: 'PREREQUISITES',
+ },
+ ],
+ [
+ 'vuepress-plugin-container',
+ {
+ type: 'api-call',
+ defaultTitle: '',
+ },
+ ],
+ [
+ 'vuepress-plugin-container',
+ {
+ type: 'request',
+ defaultTitle: 'Request',
+ },
+ ],
+ [
+ 'vuepress-plugin-container',
+ {
+ type: 'response',
+ defaultTitle: 'Response',
+ },
+ ],
+];
diff --git a/docs/.vuepress/config/sidebar-developer.js b/docs/.vuepress/config/sidebar-developer.js
new file mode 100644
index 0000000000..387a46390f
--- /dev/null
+++ b/docs/.vuepress/config/sidebar-developer.js
@@ -0,0 +1,487 @@
+const developer = [
+ {
+ title: '🚀 Getting Started',
+ collapsable: false,
+ children: [
+ ['/developer-docs/latest/getting-started/introduction', 'Introduction'],
+ ['/developer-docs/latest/getting-started/quick-start', 'Quick Start Guide'],
+ ['/developer-docs/latest/getting-started/troubleshooting', 'Frequently Asked Questions'],
+ ['/developer-docs/latest/getting-started/usage-information', 'Usage Information'],
+ ],
+ },
+ {
+ title: '⚙️ Setup & Deployment',
+ collapsable: false,
+ sidebarDepth: 0,
+ initialOpenGroupIndex: -1, // make sure that no subgroup is expanded by default
+ children: [
+ {
+ title: 'Installation',
+ path: '/developer-docs/latest/setup-deployment-guides/installation.html',
+ collapsable: true,
+ sidebarDepth: 1,
+ children: [
+ ['/developer-docs/latest/setup-deployment-guides/installation/cli.md', 'CLI'],
+ ['/developer-docs/latest/setup-deployment-guides/installation/docker.md', 'Docker'],
+ [
+ '/developer-docs/latest/setup-deployment-guides/installation/digitalocean-one-click.md',
+ 'DigitalOcean One-Click',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/installation/platformsh.md',
+ 'Platform.sh One-Click',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/installation/render.md',
+ 'Render One-Click',
+ ],
+ ],
+ },
+ ['/developer-docs/latest/setup-deployment-guides/file-structure.md', 'Project structure'],
+ {
+ title: 'Configurations',
+ path: '/developer-docs/latest/setup-deployment-guides/configurations.html',
+ collapsable: true,
+ children: [
+ {
+ title: 'Required configurations',
+ collapsable: true,
+ children: [
+ [
+ '/developer-docs/latest/setup-deployment-guides/configurations/required/databases.md',
+ 'Database',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/configurations/required/server.md',
+ 'Server',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/configurations/required/admin-panel.md',
+ 'Admin panel',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/configurations/required/middlewares.md',
+ 'Middlewares',
+ ],
+ ],
+ },
+ {
+ title: 'Optional configurations',
+ collapsable: true,
+ children: [
+ [
+ '/developer-docs/latest/setup-deployment-guides/configurations/optional/api-tokens.md',
+ 'API tokens',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/configurations/optional/functions.md',
+ 'Functions',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/configurations/optional/cronjobs.md',
+ 'Cron jobs',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/configurations/optional/api.md',
+ 'API',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/configurations/optional/plugins.md',
+ 'Plugins',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/configurations/optional/environment.md',
+ 'Environment',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/configurations/optional/public-assets.md',
+ 'Public Assets',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/configurations/optional/sso.md',
+ 'Single Sign On (SSO)',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/configurations/optional/rbac.md',
+ 'Role-Based Access Control (RBAC)',
+ ],
+ ],
+ },
+ ],
+ },
+ {
+ title: 'Deployment',
+ path: '/developer-docs/latest/setup-deployment-guides/deployment',
+ collapsable: true,
+ initialOpenGroupIndex: -1, // make sure that no subgroup is open by default — if set to 0, 'Hosting Provider Guides' is expanded
+ children: [
+ {
+ title: 'Hosting Provider Guides',
+ path:
+ '/developer-docs/latest/setup-deployment-guides/deployment.html#hosting-provider-guides',
+ collapsable: true,
+ children: [
+ [
+ '/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/21yunbox.md',
+ '21YunBox',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/amazon-aws.md',
+ 'Amazon AWS',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/azure.md',
+ 'Azure',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/digitalocean-app-platform.md',
+ 'DigitalOcean App Platform',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/digitalocean.md',
+ 'DigitalOcean Droplets',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/google-app-engine.md',
+ 'Google App Engine',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/heroku.md',
+ 'Heroku',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/qovery.md',
+ 'Qovery',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/render.md',
+ 'Render',
+ ],
+ ],
+ sidebarDepth: 2,
+ },
+ {
+ title: 'Optional Software Guides',
+ path:
+ '/developer-docs/latest/setup-deployment-guides/deployment.html#optional-software-guides',
+ collapsable: true,
+ children: [
+ [
+ '/developer-docs/latest/setup-deployment-guides/deployment/optional-software/caddy-proxy.md',
+ 'Caddy',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/deployment/optional-software/haproxy-proxy.md',
+ 'HAProxy',
+ ],
+ [
+ '/developer-docs/latest/setup-deployment-guides/deployment/optional-software/nginx-proxy.md',
+ 'Nginx',
+ ],
+ ],
+ sidebarDepth: 2,
+ },
+ ],
+ sidebarDepth: 0,
+ },
+ ],
+ },
+ {
+ title: '🔧 Development',
+ collapsable: false,
+ initialOpenGroupIndex: -1, // make sure that no subgroup is expanded by default
+ children: [
+ {
+ title: 'Back-end customization',
+ collapsable: true,
+ path: '/developer-docs/latest/development/backend-customization',
+ children: [
+ ['/developer-docs/latest/development/backend-customization/routes.md', 'Routes'],
+ ['/developer-docs/latest/development/backend-customization/policies.md', 'Policies'],
+ [
+ '/developer-docs/latest/development/backend-customization/middlewares.md',
+ 'Middlewares',
+ ],
+ [
+ '/developer-docs/latest/development/backend-customization/controllers.md',
+ 'Controllers',
+ ],
+ [
+ '/developer-docs/latest/development/backend-customization/requests-responses.md',
+ 'Requests & Responses',
+ ],
+ ['/developer-docs/latest/development/backend-customization/services.md', 'Services'],
+ ['/developer-docs/latest/development/backend-customization/models.md', 'Models'],
+ ['/developer-docs/latest/development/backend-customization/webhooks.md', 'Webhooks'],
+ ],
+ },
+ ['/developer-docs/latest/development/admin-customization', 'Admin panel customization'],
+ ['/developer-docs/latest/development/plugins-extension.md', 'Plugins extension'],
+ ['/developer-docs/latest/development/plugins-development.md', 'Plugins development'],
+ ],
+ },
+ {
+ title: '💻 Developer Resources',
+ collapsable: false,
+ initialOpenGroupIndex: -1, // make sure that no subgroup is expanded by default
+ sidebarDepth: 2,
+ children: [
+ {
+ title: 'APIs Reference',
+ collapsable: true,
+ sidebarDepth: 1,
+ children: [
+ {
+ title: 'REST API',
+ path: '/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html',
+ collapsable: true,
+ initialOpenGroupIndex: -1,
+ // sidebarDepth: 3,
+ children: [
+ {
+ title: 'API Parameters',
+ collapsable: true,
+ initialOpenGroupIndex: -1,
+ children: [
+ [
+ '/developer-docs/latest/developer-resources/database-apis-reference/rest/filtering-locale-publication.md',
+ 'Filtering, Locale, and Publication State'
+ ],
+ [
+ '/developer-docs/latest/developer-resources/database-apis-reference/rest/populating-fields.md',
+ 'Population & Field Selection'
+ ],
+ [
+ '/developer-docs/latest/developer-resources/database-apis-reference/rest/sort-pagination.md',
+ 'Sort & Pagination'
+ ],
+ ]
+ },
+ [
+ '/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html',
+ 'API Endpoints'
+ ]
+ ],
+ },
+ [
+ '/developer-docs/latest/developer-resources/database-apis-reference/graphql-api.md',
+ 'GraphQL API',
+ ],
+ {
+ title: 'Query Engine API',
+ path:
+ '/developer-docs/latest/developer-resources/database-apis-reference/query-engine-api.html',
+ collapsable: true,
+ // sidebarDepth: 3,
+ children: [
+ [
+ '/developer-docs/latest/developer-resources/database-apis-reference/query-engine/single-operations.md',
+ 'Single Operations',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/database-apis-reference/query-engine/bulk-operations.md',
+ 'Bulk Operations',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/database-apis-reference/query-engine/filtering.md',
+ 'Filtering',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/database-apis-reference/query-engine/populating.md',
+ 'Populating',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/database-apis-reference/query-engine/order-pagination.md',
+ 'Ordering & pagination',
+ ],
+ ],
+ },
+ {
+ title: 'Entity Service API',
+ path:
+ '/developer-docs/latest/developer-resources/database-apis-reference/entity-service-api',
+ collapsable: true,
+ children: [
+ [
+ '/developer-docs/latest/developer-resources/database-apis-reference/entity-service/crud.md',
+ 'CRUD operations',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/database-apis-reference/entity-service/filter.md',
+ 'Filters',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/database-apis-reference/entity-service/populate.md',
+ 'Populate',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/database-apis-reference/entity-service/order-pagination.md',
+ 'Ordering & pagination',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/database-apis-reference/entity-service/components-dynamic-zones.md',
+ 'Components and dynamic zones',
+ ],
+ ],
+ },
+ {
+ title: 'Plugin APIs Reference',
+ collapsable: true,
+ children: [
+ [
+ '/developer-docs/latest/developer-resources/plugin-api-reference/server.md',
+ 'Server API for plugins',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md',
+ 'Admin Panel API for plugins',
+ ],
+ ],
+ },
+ ],
+ },
+ ['/developer-docs/latest/developer-resources/cli/CLI', 'Command Line Interface'],
+ ['/developer-docs/latest/developer-resources/error-handling.md', 'Error handling'],
+ {
+ title: 'Integrations',
+ path: '/developer-docs/latest/developer-resources/content-api/integrations.html',
+ collapsable: true,
+ sidebarDepth: 1,
+ children: [
+ ['/developer-docs/latest/developer-resources/content-api/integrations/react', 'React'],
+ [
+ '/developer-docs/latest/developer-resources/content-api/integrations/vue-js',
+ 'Vue.js',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/content-api/integrations/angular',
+ 'Angular',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/content-api/integrations/next-js',
+ 'Next.js',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/content-api/integrations/nuxt-js',
+ 'Nuxt.js',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/content-api/integrations/graphql',
+ 'GraphQL',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/content-api/integrations/gatsby',
+ 'Gatsby',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/content-api/integrations/gridsome',
+ 'Gridsome',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/content-api/integrations/jekyll',
+ 'Jekyll',
+ ],
+ ['/developer-docs/latest/developer-resources/content-api/integrations/11ty', '11ty'],
+ [
+ '/developer-docs/latest/developer-resources/content-api/integrations/svelte',
+ 'Svelte',
+ ],
+ [
+ '/developer-docs/latest/developer-resources/content-api/integrations/sapper',
+ 'Sapper',
+ ],
+ ['/developer-docs/latest/developer-resources/content-api/integrations/ruby', 'Ruby'],
+ [
+ '/developer-docs/latest/developer-resources/content-api/integrations/python',
+ 'Python',
+ ],
+ ['/developer-docs/latest/developer-resources/content-api/integrations/dart', 'Dart'],
+ [
+ '/developer-docs/latest/developer-resources/content-api/integrations/flutter',
+ 'Flutter',
+ ],
+ ['/developer-docs/latest/developer-resources/content-api/integrations/go', 'Go'],
+ ['/developer-docs/latest/developer-resources/content-api/integrations/php', 'PHP'],
+ [
+ '/developer-docs/latest/developer-resources/content-api/integrations/laravel',
+ 'Laravel',
+ ],
+ ],
+ },
+ ],
+ },
+ {
+ title: '🧩 Strapi plugins',
+ path: '/developer-docs/latest/plugins/plugins-intro.html',
+ collapsable: false,
+ children: [
+ ['/developer-docs/latest/plugins/graphql', 'GraphQL'],
+ ['/developer-docs/latest/plugins/i18n', 'Internationalization (i18n)'],
+ ['/developer-docs/latest/plugins/users-permissions', 'Users & Permissions'],
+ ['/developer-docs/latest/plugins/email', 'Email'],
+ ['/developer-docs/latest/plugins/upload', 'Upload'],
+ ['/developer-docs/latest/plugins/documentation', 'API Documentation'],
+ ],
+ sidebarDepth: 1,
+ },
+ {
+ title: '♻️ Update & Migration',
+ collapsable: false,
+ children: [
+ ['/developer-docs/latest/update-migration-guides/update-version.md', 'Update'],
+ {
+ title: 'Migration',
+ path: '/developer-docs/latest/update-migration-guides/migration-guides.html',
+ collapsable: true,
+ children: [
+ {
+ title: 'v4',
+ path: '/developer-docs/latest/update-migration-guides/migration-guides.html#v4-stable-guides',
+ collapsable: true,
+ children: [
+ {
+ title: 'Plugin migration guide',
+ path: '/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin-migration.html',
+ collapsable: true,
+ children: [
+ ['/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/update-folder-structure.md', 'Updating the folder structure'],
+ ['/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-back-end.md', 'Migrating the back end'],
+ ['/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-front-end.md', 'Migrating the front end'],
+ ['/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/enable-plugin.md', 'Enabling a plugin'],
+ ]
+ }
+ // ['', 'Code migration guide'],
+ // ['', 'Data migration guide'],
+ ]
+ },
+ ['/developer-docs/latest/update-migration-guides/migration-guides.html#v3-stable-guides', 'v3 stable'],
+ ]
+ }
+ ],
+ },
+ {
+ title: '📚 Guides',
+ collapsable: true,
+ children: [
+ ['/developer-docs/latest/guides/auth-request', 'Authenticated request'],
+ // ['/developer-docs/latest/guides/slug', 'Create a slug system'],
+ // ['/developer-docs/latest/guides/is-owner', 'Create is owner policy'],
+ // ['/developer-docs/latest/guides/custom-admin', 'Custom admin'],
+ // ['/developer-docs/latest/guides/custom-data-response', 'Custom data response'],
+ ['/developer-docs/latest/guides/draft', 'Draft system'],
+ // ['/developer-docs/latest/guides/error-catching', 'Error catching'],
+ // ['/developer-docs/latest/guides/external-data', 'Fetching external data'],
+ ['/developer-docs/latest/guides/jwt-validation', 'JWT validation'],
+ ['/developer-docs/latest/guides/process-manager', 'Process manager'],
+ ['/developer-docs/latest/guides/scheduled-publication', 'Scheduled publication'],
+ // ['/developer-docs/latest/guides/secure-your-app', 'Secure your application'],
+ // ['/developer-docs/latest/guides/send-email', 'Send email programmatically'],
+ // [
+ // '/developer-docs/latest/guides/registering-a-field-in-admin',
+ // 'Registering a new field in the admin panel',
+ // ],
+ // ['/developer-docs/latest/guides/client', 'Setup a third party client'],
+ ['/developer-docs/latest/guides/unit-testing', 'Unit testing'],
+ ],
+ },
+];
diff --git a/docs/.vuepress/config/sidebar-user.js b/docs/.vuepress/config/sidebar-user.js
new file mode 100644
index 0000000000..1d6c4b4aed
--- /dev/null
+++ b/docs/.vuepress/config/sidebar-user.js
@@ -0,0 +1,104 @@
+const user = [
+ {
+ collapsable: false,
+ title: '',
+ children: [
+ ['/user-docs/latest/getting-started/introduction', 'Welcome to the Strapi user guide!'],
+ ],
+ },
+ {
+ collapsable: false,
+ title: 'Content Manager',
+ children: [
+ [
+ '/user-docs/latest/content-manager/introduction-to-content-manager',
+ 'Introduction to the Content Manager',
+ ],
+ [
+ '/user-docs/latest/content-manager/configuring-view-of-content-type',
+ 'Configuring the views of a content-type',
+ ],
+ ['/user-docs/latest/content-manager/writing-content', 'Writing content'],
+ [
+ '/user-docs/latest/content-manager/managing-relational-fields',
+ 'Managing relational fields',
+ ],
+ ['/user-docs/latest/content-manager/translating-content', 'Translating content'],
+ [
+ '/user-docs/latest/content-manager/saving-and-publishing-content',
+ 'Saving, publishing and deleting content',
+ ],
+ ],
+ },
+ {
+ collapsable: false,
+ title: 'Content-type Builder',
+ children: [
+ [
+ '/user-docs/latest/content-types-builder/introduction-to-content-types-builder',
+ 'Introduction to the Content-type Builder',
+ ],
+ [
+ '/user-docs/latest/content-types-builder/creating-new-content-type',
+ 'Creating content-types',
+ ],
+ [
+ '/user-docs/latest/content-types-builder/managing-content-types',
+ 'Managing content-types',
+ ],
+ [
+ '/user-docs/latest/content-types-builder/configuring-fields-content-type',
+ 'Configuring fields for content-types',
+ ],
+ ],
+ },
+ {
+ collapsable: false,
+ title: 'Users, Roles & Permissions',
+ children: [
+ [
+ '/user-docs/latest/users-roles-permissions/introduction-to-users-roles-permissions',
+ 'Introduction to users, roles & permissions',
+ ],
+ [
+ '/user-docs/latest/users-roles-permissions/configuring-administrator-roles',
+ 'Configuring administrator roles',
+ ],
+ [
+ '/user-docs/latest/users-roles-permissions/managing-administrators',
+ 'Managing administrator accounts',
+ ],
+ [
+ '/user-docs/latest/users-roles-permissions/configuring-end-users-roles',
+ 'Configuring end-user roles',
+ ],
+ [
+ '/user-docs/latest/users-roles-permissions/managing-end-users',
+ 'Managing end-user accounts',
+ ],
+ ],
+ },
+ {
+ collapsable: false,
+ title: 'Plugins',
+ children: [
+ ['/user-docs/latest/plugins/introduction-to-plugins', 'Introduction to plugins'],
+ [
+ '/user-docs/latest/plugins/installing-plugins-via-marketplace',
+ 'Installing plugins via the Marketplace',
+ ],
+ ['/user-docs/latest/plugins/strapi-plugins', 'List of Strapi plugins'],
+ ],
+ },
+ {
+ collapsable: false,
+ title: 'General settings',
+ children: [
+ ['/user-docs/latest/settings/managing-global-settings', 'Managing global settings'],
+ [
+ '/user-docs/latest/settings/configuring-users-permissions-plugin-settings',
+ 'Configuring Users & Permissions plugin settings',
+ ],
+ ],
+ },
+];
\ No newline at end of file
diff --git a/docs/.vuepress/config/theme-config.js b/docs/.vuepress/config/theme-config.js
new file mode 100644
index 0000000000..fac0e4fcef
--- /dev/null
+++ b/docs/.vuepress/config/theme-config.js
@@ -0,0 +1,151 @@
+const themeConfig = {
+ logo: '/assets/logo.png',
+ nav: [
+ {
+ text: 'Resource Center',
+ link: 'https://strapi.io/resource-center',
+ },
+ {
+ text: 'v4 Documentation',
+ items: [
+ {
+ text: 'Developer Docs',
+ items: [
+ {
+ text: 'Getting Started',
+ link: '/developer-docs/latest/getting-started/introduction.html',
+ },
+ {
+ text: 'Setup & Deployment',
+ link: '/developer-docs/latest/setup-deployment-guides/installation.html',
+ },
+ {
+ text: 'Plugins',
+ link: '/developer-docs/latest/plugins/plugins-intro.html',
+ },
+ {
+ text: 'Development',
+ link: '/developer-docs/latest/development/backend-customization.html',
+ },
+ {
+ text: 'Update & Migration',
+ link: '/developer-docs/latest/update-migration-guides/update-version.html',
+ },
+ {
+ text: 'Developer Resources',
+ link: '/developer-docs/latest/developer-resources/content-api/content-api.html',
+ },
+ ],
+ },
+ {
+ text: 'User Guide',
+ items: [
+ {
+ text: 'Getting Started',
+ link: '/user-docs/latest/getting-started/introduction.html',
+ },
+ {
+ text: 'Content Manager',
+ link: '/user-docs/latest/content-manager/introduction-to-content-manager.html',
+ },
+ {
+ text: 'Content-type Builder',
+ link:
+ '/user-docs/latest/content-types-builder/introduction-to-content-types-builder.html',
+ },
+ {
+ text: 'Users, Roles, and Permissions',
+ link:
+ '/user-docs/latest/users-roles-permissions/introduction-to-users-roles-permissions.html',
+ },
+ {
+ text: 'Plugins',
+ link: '/user-docs/latest/plugins/introduction-to-plugins.html',
+ },
+ {
+ text: 'General Settings',
+ link: '/user-docs/latest/settings/managing-global-settings.html',
+ },
+ ],
+ },
+ ],
+ },
+ {
+ text: 'v3 documentation',
+ link: 'https://docs-v3.strapi.io',
+ },
+ {
+ text: 'Ecosystem',
+ items: [
+ {
+ text: 'Strapi',
+ items: [
+ {
+ text: 'Website',
+ link: 'https://strapi.io',
+ },
+ {
+ text: 'Blog',
+ link: 'https://strapi.io/blog',
+ },
+ {
+ text: 'StrapiConf 2021',
+ link: 'https://www.strapi.io/strapi-conf-2021',
+ },
+ ],
+ },
+ {
+ text: 'Community',
+ items: [
+ {
+ text: 'Forum',
+ link: 'https://forum.strapi.io',
+ },
+ {
+ text: 'Discord',
+ link: 'https://discord.strapi.io',
+ },
+ {
+ text: 'Awesome-Strapi',
+ link: 'https://github.com/strapi/awesome-strapi',
+ },
+ ],
+ },
+ {
+ text: 'Resources',
+ items: [
+ {
+ text: 'Tutorials',
+ link: 'https://strapi.io/tutorials',
+ },
+ {
+ text: 'Academy',
+ link: 'https://academy.strapi.io/',
+ },
+ ],
+ },
+ ],
+ },
+ {
+ text: "We're hiring!",
+ link: 'https://strapi.io/careers#open-positions',
+ },
+ ],
+ repo: 'strapi/documentation',
+ docsDir: 'docs',
+ docsBranch: 'main',
+ algolia: {
+ appId: '9FTY6J9E4X',
+ apiKey: 'cf49c82a1865df2618a3d89e18657051',
+ indexName: 'documentation',
+ },
+ editLinks: true,
+ editLinkText: 'Improve this page',
+ serviceWorker: true,
+ sidebarDepth: 1,
+ smoothScroll: false,
+ sidebar: {
+ '/developer-docs/latest/': sidebar.developer,
+ '/user-docs/latest/': sidebar.user,
+ },
+};
diff --git a/docs/.vuepress/public/assets/logo.png b/docs/.vuepress/public/assets/logo.png
index 41a42ee993..02d9121173 100644
Binary files a/docs/.vuepress/public/assets/logo.png and b/docs/.vuepress/public/assets/logo.png differ
diff --git a/docs/developer-docs/latest/assets/guides/register-field-admin/ckeditor-rich-text.png b/docs/developer-docs/latest/assets/guides/register-field-admin/ckeditor-rich-text.png
new file mode 100644
index 0000000000..8b5da3b49a
Binary files /dev/null and b/docs/developer-docs/latest/assets/guides/register-field-admin/ckeditor-rich-text.png differ
diff --git a/docs/developer-docs/latest/concepts/draft-and-publish.md b/docs/developer-docs/latest/concepts/draft-and-publish.md
index d1cd25d59a..42001c39d5 100644
--- a/docs/developer-docs/latest/concepts/draft-and-publish.md
+++ b/docs/developer-docs/latest/concepts/draft-and-publish.md
@@ -10,23 +10,23 @@ The draft and publish feature allows you to save your content as a draft, to pub
## Activating or deactivating the draft and publish feature
-By default, the draft and publish feature is enabled for all newly created collection and single types. It is however possible to disable the feature at the content-type level (i.e. it can be enabled for one content type, but disabled for another).
+By default, the draft and publish feature is enabled for all newly created collection and single types. It is however possible to disable the feature at the content-type level (i.e. it can be enabled for one content-type, but disabled for another).
::: warning
If the feature is deactivated while contents are saved as drafts, they will automatically be deleted. Make sure all contents are published before deactivating the feature.
:::
-To deactivate the draft and publish feature for a content type:
+To deactivate the draft and publish feature for a content-type:
-1. Go to the Plugins > Content-Type Builder.
+1. Go to the Plugins > Content-type Builder.
2. Select the collection or single type for which you want the draft and publish feature to be deactivated.
-3. Click on the Edit button to access the content type's configurations.
+3. Click on the Edit button to access the content-type's configurations.
4. Click on the "Advanced Settings" tab.
5. In the DRAFT/PUBLISH section, click on the **OFF** button.
6. Click on the **Finish** button to confirm the deactivation of the feature.
::: tip
-It is also possible to activate or deactivate the feature when creating a new content type. To do so: after clicking on the **Create new collection/single type** button in the Content-Type Builder, follow steps 4 and 5 from the procedure above.
+It is also possible to activate or deactivate the feature when creating a new content-type. To do so: after clicking on the **Create new collection/single type** button in the Content-type Builder, follow steps 4 and 5 from the procedure above.
:::

diff --git a/docs/developer-docs/latest/developer-resources/cli/CLI.md b/docs/developer-docs/latest/developer-resources/cli/CLI.md
index c9d8dc0fda..a67554c6c7 100644
--- a/docs/developer-docs/latest/developer-resources/cli/CLI.md
+++ b/docs/developer-docs/latest/developer-resources/cli/CLI.md
@@ -6,7 +6,11 @@ canonicalUrl: https://docs.strapi.io/developer-docs/latest/developer-resources/c
# Command Line Interface (CLI)
-Strapi comes with a full featured Command Line Interface (CLI) which lets you scaffold and manage your project in seconds.
+Strapi comes with a full featured Command Line Interface (CLI) which lets you scaffold and manage your project in seconds.
+
+::: note
+It is recommend to install Strapi locally only, which requires prefixing all of the following `strapi` commands with the package manager used for the project setup (e.g `npm run strapi help` or `yarn strapi help`) or a dedicated node package executor (e.g. `npx strapi help`).
+:::
## strapi new
@@ -77,7 +81,7 @@ Allowed environment variables:
| STRAPI_LOG_LEVEL | Values can be 'fatal', 'error', 'warn', 'info', 'debug', 'trace' | string | `debug` |
| STRAPI_LOG_TIMESTAMP | Enables or disables the inclusion of a timestamp in the log message. Values can be `true` or `false` | string | `false`|
| STRAPI_LOG_FORCE_COLOR | Values can be `true` or `false` | string | `true` |
-| STRAPI_LOG_PRETTY_PRINT | If pino-pretty module will be used to format logs. Values can be `true` or `false` | string | `true` |
+| STRAPI_LOG_PRETTY_PRINT | If `true` then pino-pretty module will be used to format logs. Values can be `true` or `false` | string | `true` |
## strapi build
@@ -96,7 +100,7 @@ options: [--no-optimization]
## strapi watch-admin
-Starts the admin server. Strapi should already be running with `strapi develop`.
+Starts the admin server. Strapi should already be running with `strapi develop`.
```sh
strapi watch-admin
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/11ty.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/11ty.md
index ed0a771722..62261db05a 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/11ty.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/11ty.md
@@ -127,9 +127,9 @@ yarn add axios eleventy-plugin-error-overlay html-minifier
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
:::: api-call
::: request Example GET request
@@ -249,9 +249,9 @@ pagination:
{% endfor %}
```
-Execute a `GET` request on the `category` Collection Type in order to fetch a specific category with all the associated restaurants.
+Execute a `GET` request on the `category` collection type in order to fetch a specific category with all the associated restaurants.
-Be sure that you activated the `find` permission for the `category` Collection Type.
+Be sure that you activated the `find` permission for the `category` collection type.
:::: api-call
::: request Example GET request
@@ -367,5 +367,5 @@ You can find your restaurants and categories by browsing `http://localhost:8081/
## Conclusion
-Here is how to request your Collection Types in Strapi using 11ty.
+Here is how to request your collection types in Strapi using 11ty.
Learn more about [11ty](https://www.11ty.dev/).
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/angular.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/angular.md
index 36652955f2..28699c6792 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/angular.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/angular.md
@@ -44,9 +44,9 @@ No installation needed
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
::::: tabs card
@@ -219,9 +219,9 @@ export class AppComponent implements OnInit {
## POST Request your collection type
-Execute a `POST` request on the `restaurant` Collection Type in order to create a restaurant.
+Execute a `POST` request on the `restaurant` collection type in order to create a restaurant.
-Be sure that you activated the `create` permission for the `restaurant` Collection Type and the `find` permission fot the `category` Collection type.
+Be sure that you activated the `create` permission for the `restaurant` collection type and the `find` permission fot the `category` collection type.
In this example a `japanese` category has been created which has the id: 3.
@@ -534,9 +534,9 @@ export class AppComponent implements OnInit {
### PUT Request your collection type
-Execute a `PUT` request on the `restaurant` Collection Type in order to update the category of a restaurant.
+Execute a `PUT` request on the `restaurant` collection type in order to update the category of a restaurant.
-Be sure that you activated the `put` permission for the `restaurant` Collection Type.
+Be sure that you activated the `put` permission for the `restaurant` collection type.
::::: tabs card
@@ -615,4 +615,4 @@ fetch('http://localhost:1337/api/restaurants/2', {
## Conclusion
-Here is how to request your Collection Types in Strapi using Angular. When you create a Collection Type or a Single Type you will have a certain number of REST API endpoints available to interact with.
+Here is how to request your collection types in Strapi using Angular. When you create a collection type or a single type you will have a certain number of REST API endpoints available to interact with.
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/dart.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/dart.md
index fa01ff32f5..eb132be732 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/dart.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/dart.md
@@ -41,9 +41,9 @@ dart pub get
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
:::: api-call
::: request Example GET request
@@ -128,9 +128,9 @@ void main() {
## POST Request your collection type
-Execute a `POST` request on the `restaurant` Collection Type in order to create a restaurant.
+Execute a `POST` request on the `restaurant` collection type in order to create a restaurant.
-Be sure that you activated the `create` permission for the `restaurant` Collection Type and the `find` permission for the `category` Collection type.
+Be sure that you activated the `create` permission for the `restaurant` collection type and the `find` permission for the `category` Collection type.
In this example a `japanese` category has been created which has the id: 3.
@@ -222,9 +222,9 @@ void main() {
## PUT Request your collection type
-Execute a `PUT` request on the `restaurant` Collection Type in order to update the category of a restaurant.
+Execute a `PUT` request on the `restaurant` collection type in order to update the category of a restaurant.
-Be sure that you activated the `put` permission for the `restaurant` Collection Type.
+Be sure that you activated the `put` permission for the `restaurant` collection type.
:::: api-call
::: request Example PUT request
@@ -316,4 +316,4 @@ void main() {
## Conclusion
-Here is how to request your Collection Types in Strapi using Dart. When you create a Collection Type or a Single Type you will have a certain number of [REST API endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints) available to interact with.
+Here is how to request your collection types in Strapi using Dart. When you create a collection type or a single type you will have a certain number of [REST API endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints) available to interact with.
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/flutter.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/flutter.md
index 8d710f6186..15612e53b2 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/flutter.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/flutter.md
@@ -50,9 +50,9 @@ flutter pub get
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
:::: api-call
::: request Example GET request
@@ -111,9 +111,9 @@ print(response.body)
## POST Request your collection type
-Execute a `POST` request on the `restaurant` Collection Type in order to create a restaurant.
+Execute a `POST` request on the `restaurant` collection type in order to create a restaurant.
-Be sure that you activated the `create` permission for the `restaurant` Collection Type and the `find` permission for the `category` Collection type.
+Be sure that you activated the `create` permission for the `restaurant` collection type and the `find` permission for the `category` Collection type.
In this example a `japanese` category has been created which has the id: 3.
@@ -166,9 +166,9 @@ var response = await http.post(
## PUT Request your collection type
-Execute a `PUT` request on the `restaurant` Collection Type in order to update the category of a restaurant.
+Execute a `PUT` request on the `restaurant` collection type in order to update the category of a restaurant.
-Be sure that you activated the `put` permission for the `restaurant` Collection Type.
+Be sure that you activated the `put` permission for the `restaurant` collection type.
:::: api-call
::: request Example PUT request
@@ -217,4 +217,4 @@ var response = await http.put(
## Conclusion
-Here is how to request your Collection Types in Strapi using Dart/Flutter. When you create a Collections Type or a Single Type you will have a certain number of [REST API endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints) available to interact with.
+Here is how to request your collection types in Strapi using Dart/Flutter. When you create a collections type or a single type you will have a certain number of [REST API endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints) available to interact with.
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/gatsby.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/gatsby.md
index b695ddc938..a2b6240688 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/gatsby.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/gatsby.md
@@ -46,9 +46,9 @@ yarn add gatsby-source-strapi
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
:::: api-call
:::request Example GET request
@@ -129,9 +129,9 @@ const IndexPage = () => (
export default IndexPage;
```
-Execute a `GET` request on the `category` Collection Type in order to fetch a specific category with all the associated restaurants.
+Execute a `GET` request on the `category` collection type in order to fetch a specific category with all the associated restaurants.
-Be sure that you activated the `findOne` permission for the `category` Collection Type.
+Be sure that you activated the `findOne` permission for the `category` collection type.
:::: api-call
::: request Example GET request
@@ -306,5 +306,5 @@ Feel free to do the same for your restaurants!
## Conclusion
-Here is how to request your Collection Types in Strapi using Gatsby.
+Here is how to request your collection types in Strapi using Gatsby.
Learn more about [GraphQL](/developer-docs/latest/plugins/graphql.md).
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/go.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/go.md
index ba585cfc70..2f24c950a8 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/go.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/go.md
@@ -27,9 +27,9 @@ We will use the "net/http" package along with other packages.
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
:::: api-call
::: request Example GET request
@@ -98,9 +98,9 @@ func getD() {
```
## POST Request your collection type
-Execute a `POST` request on the `restaurant` Collection Type in order to create a restaurant.
+Execute a `POST` request on the `restaurant` collection type in order to create a restaurant.
-Be sure that you activated the `create` permission for the `restaurant` Collection Type and the `find` permission for the `category` Collection type.
+Be sure that you activated the `create` permission for the `restaurant` collection type and the `find` permission for the `category` Collection type.
:::: api-call
::: request Example POST request
@@ -185,9 +185,9 @@ func postD() {
## PUT Request your collection type
-Execute a `PUT` request on the `restaurant` Collection Type in order to update the category of a restaurant.
+Execute a `PUT` request on the `restaurant` collection type in order to update the category of a restaurant.
-Be sure that you activated the `update` permission for the `restaurant` Collection Type.
+Be sure that you activated the `update` permission for the `restaurant` collection type.
PUT Request is sligtly different as we need to target the particular thing we want update. We do this by first making a request to http://localhost:1337/api/restaurants/1 and then update what we want to update. In this example, we are going to update "Biscotte Restaurant" to "Restaurant Home".
:::: api-call
@@ -316,6 +316,6 @@ func putD() {
## Conclusion
-Here is how to request your Collection Types in Strapi using Go. When you create a Collection Type or a Single Type you will have a certain number of REST API endpoints available to interact with.
+Here is how to request your collection types in Strapi using Go. When you create a collection type or a single type you will have a certain number of REST API endpoints available to interact with.
We just used the GET, POST and PUT methods here but you can [get one entry](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#get-an-entry), and [delete](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#delete-an-entry) an entry too. Learn more about [API Endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints).
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/graphql.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/graphql.md
index 94272e3700..36e87f941b 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/graphql.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/graphql.md
@@ -315,6 +315,6 @@ export default {
## Conclusion
-This is how you request your Collection Types in Strapi using GraphQL.
+This is how you request your collection types in Strapi using GraphQL.
Feel free to explore more about [GraphQL](/developer-docs/latest/plugins/graphql.md).
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/gridsome.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/gridsome.md
index aeae545cb6..2e6ff1da79 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/gridsome.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/gridsome.md
@@ -48,9 +48,9 @@ module.exports = {
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
:::: api-call
::: request Example GET request
@@ -130,9 +130,9 @@ query {
```
-Execute a `GET` request on the `category` Collection Type in order to fetch a specific category with all the associated restaurants.
+Execute a `GET` request on the `category` collection type in order to fetch a specific category with all the associated restaurants.
-Be sure that you activated the `findOne` permission for the `category` Collection Type.
+Be sure that you activated the `findOne` permission for the `category` collection type.
:::: api-call
::: request Example GET request
@@ -274,6 +274,6 @@ Feel free to do the same for your restaurants!
## Conclusion
-Here is how to request your Collection Types in Strapi using Gridsome.
+Here is how to request your collection types in Strapi using Gridsome.
Learn more about [GraphQL](/developer-docs/latest/plugins/graphql.md)
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/jekyll.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/jekyll.md
index 2425182c60..2537ec8ec2 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/jekyll.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/jekyll.md
@@ -63,9 +63,9 @@ bundle install
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
### Example
@@ -90,9 +90,9 @@ layout: default
```
-Execute a `GET` request on the `category` Collection Type in order to fetch a specific category with all the associated restaurants.
+Execute a `GET` request on the `category` collection type in order to fetch a specific category with all the associated restaurants.
-Be sure that you activated the `findOne` permission for the `category` Collection Type.
+Be sure that you activated the `findOne` permission for the `category` collection type.
### Example
@@ -169,5 +169,5 @@ Feel free to do the same for your restaurants!
## Conclusion
-Here is how to request your Collection Types in Strapi using Jekyll.
+Here is how to request your collection types in Strapi using Jekyll.
Learn more about Jekyll with their [official documentation](https://jekyllrb.com/docs/).
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/laravel.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/laravel.md
index 2a3ee734d4..f572f60d68 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/laravel.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/laravel.md
@@ -37,9 +37,9 @@ STRAPI_CACHE_TIME=3600
## Get your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
::: request Example GET request
@@ -57,7 +57,7 @@ $restaurants = $strapi->collection('restaurants', $sortKey = 'id', $sortOrder =
## Accessing single type items
-You may also access Single Type items as follows:
+You may also access single type items as follows:
```php
$strapi = new Dbfx\LaravelStrapi();
@@ -86,6 +86,6 @@ $entry = $strapi->entry('restaurants', $id = 5);
## Conclusion
-Here is how to request your Collection Types in Strapi using Laravel. When you create a Collection Type or a Single Type you will have a certain number of REST API endpoints available to interact with.
+Here is how to request your collection types in Strapi using Laravel. When you create a collection type or a single type you will have a certain number of REST API endpoints available to interact with.
There is more documentation available in the [README](https://github.com/dbfx/laravel-strapi) or in the [PHP integration guide](/developer-docs/latest/developer-resources/content-api/integrations/php.md).
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/next-js.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/next-js.md
index 59cc90861b..a59141fb3f 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/next-js.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/next-js.md
@@ -56,9 +56,9 @@ No installation needed.
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
::::: tabs card
@@ -227,9 +227,9 @@ export default Home;
## POST Request your collection type
-Execute a `POST` request on the `restaurant` Collection Type in order to create a restaurant.
+Execute a `POST` request on the `restaurant` collection type in order to create a restaurant.
-Be sure that you activated the `create` permission for the `restaurant` Collection Type and the `find` permission for the `category` Collection type.
+Be sure that you activated the `create` permission for the `restaurant` collection type and the `find` permission for the `category` Collection type.
In this example a `japanese` category has been created which has the id: 3.
@@ -556,9 +556,9 @@ export default Home;
## PUT Request your collection type
-Execute a `PUT` request on the `restaurant` Collection Type in order to update the category of a restaurant.
+Execute a `PUT` request on the `restaurant` collection type in order to update the category of a restaurant.
-Be sure that you activated the `put` permission for the `restaurant` Collection Type.
+Be sure that you activated the `put` permission for the `restaurant` collection type.
::::: tabs card
@@ -638,6 +638,6 @@ fetch('http://localhost:1337/api/restaurants/2', {
## Conclusion
-Here is how to request your Collection Types in Strapi using Next.js. When you create a Collection Type or a Single Type you will have a certain number of REST API endpoints available to interact with.
+Here is how to request your collection types in Strapi using Next.js. When you create a collection type or a single type you will have a certain number of REST API endpoints available to interact with.
We just used the GET, POST and PUT methods here but you can [get one entry](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#get-an-entry), and [delete](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#delete-an-entry) an entry too. Learn more about [API Endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints).
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/nuxt-js.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/nuxt-js.md
index dc4b78d892..0ee519022a 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/nuxt-js.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/nuxt-js.md
@@ -76,9 +76,9 @@ No installation needed
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
::::: tabs card
@@ -316,9 +316,9 @@ export default {
## POST Request your collection type
-Execute a `POST` request on the `restaurant` Collection Type in order to create a restaurant.
+Execute a `POST` request on the `restaurant` collection type in order to create a restaurant.
-Be sure that you activated the `create` permission for the `restaurant` Collection Type and the `find` permission for the `category` Collection type.
+Be sure that you activated the `create` permission for the `restaurant` collection type and the `find` permission for the `category` Collection type.
In this example a `japanese` category has been created which has the id: 3.
@@ -683,9 +683,9 @@ export default {
## PUT Request your collection type
-Execute a `PUT` request on the `restaurant` Collection Type in order to update the category of a restaurant.
+Execute a `PUT` request on the `restaurant` collection type in order to update the category of a restaurant.
-Be sure that you activated the `put` permission for the `restaurant` Collection Type.
+Be sure that you activated the `put` permission for the `restaurant` collection type.
::::: tabs card
@@ -778,6 +778,6 @@ fetch('http://localhost:1337/api/restaurants/2', {
## Conclusion
-Here is how to request your Collection Types in Strapi using Nuxt.js. When you create a Collection Type or a Single Type you will have a certain number of REST API endpoints available to interact with.
+Here is how to request your collection types in Strapi using Nuxt.js. When you create a collection type or a single type you will have a certain number of REST API endpoints available to interact with.
We just used the GET, POST and PUT methods here but you can [get one entry](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#get-an-entry), and [delete](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#delete-an-entry) an entry too. Learn more about [API Endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints).
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/php.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/php.md
index 16664925a7..891bf0d1ac 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/php.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/php.md
@@ -23,9 +23,9 @@ We will use cURL, a built-in PHP extension that allows us to receive and send in
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
:::: api-call
::: request Example GET request
@@ -89,9 +89,9 @@ getRestaurants();
## POST Request your collection type
-Execute a `POST` request on the `restaurant` Collection Type in order to create a restaurant.
+Execute a `POST` request on the `restaurant` collection type in order to create a restaurant.
-Be sure that you activated the `create` permission for the `restaurant` Collection Type and the `find` permission for the `category` Collection type.
+Be sure that you activated the `create` permission for the `restaurant` collection type and the `find` permission for the `category` Collection type.
:::: api-call
::: request Example POST request
@@ -192,9 +192,9 @@ postRestaurant();
## PUT Request your collection type
-Execute a `PUT` request on the `restaurant` Collection Type in order to update the category of a restaurant.
+Execute a `PUT` request on the `restaurant` collection type in order to update the category of a restaurant.
-Be sure that you activated the `update` permission for the `restaurant` Collection Type.
+Be sure that you activated the `update` permission for the `restaurant` collection type.
PUT Request is sligtly different as we need to target the particular entry we want update. We do this by first making a request to http://localhost:1337/api/restaurants/1 and then update what we want to update. In this example, we are going to update "Biscotte Restaurant" to "Femoni Kitchen".
:::: api-call
@@ -440,6 +440,6 @@ postRestaurantWithAuth($jwt);
## Conclusion
-Here is how to request your Collection Types in Strapi using PHP. When you create a Collection Type or a Single Type you will have a certain number of REST API endpoints available to interact with.
+Here is how to request your collection types in Strapi using PHP. When you create a collection type or a single type you will have a certain number of REST API endpoints available to interact with.
We just used the GET, POST and PUT methods here but you can [get one entry](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#get-an-entry), and [delete](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#delete-an-entry) an entry too. Learn more about [API Endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints).
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/python.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/python.md
index 869cd9633a..16d00b31b7 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/python.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/python.md
@@ -30,9 +30,9 @@ python -m pip install requests
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
:::: api-call
::: request Example GET request
@@ -106,9 +106,9 @@ print(restaurant.all())
## POST Request your collection type
-Execute a `POST` request on the `restaurant` Collection Type in order to create a restaurant.
+Execute a `POST` request on the `restaurant` collection type in order to create a restaurant.
-Be sure that you activated the `create` permission for the `restaurant` Collection Type and the `find` permission for the `category` Collection type.
+Be sure that you activated the `create` permission for the `restaurant` collection type and the `find` permission for the `category` Collection type.
In this example a `japanese` category has been created which has the id: 3.
@@ -189,9 +189,9 @@ print(restaurant.create({
## PUT Request your collection type
-Execute a `PUT` request on the `restaurant` Collection Type in order to update the category of a restaurant.
+Execute a `PUT` request on the `restaurant` collection type in order to update the category of a restaurant.
-Be sure that you activated the `put` permission for the `restaurant` Collection Type.
+Be sure that you activated the `put` permission for the `restaurant` collection type.
:::: api-call
::: request Example PUT request
@@ -275,4 +275,4 @@ print(restaurant.update(2, {
## Conclusion
-Here is how to request your Collection Types in Strapi using Python. When you create a Collection Type or a Single Type you will have a certain number of REST API endpoints available to interact with.
+Here is how to request your collection types in Strapi using Python. When you create a collection type or a single type you will have a certain number of REST API endpoints available to interact with.
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/react.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/react.md
index 51fa083329..4ac84bf2f6 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/react.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/react.md
@@ -57,9 +57,9 @@ No installation needed
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type
+Be sure that you activated the `find` permission for the `restaurant` collection type
::::: tabs card
@@ -260,9 +260,9 @@ export default App;
## POST Request your collection type
-Execute a `POST` request on the `restaurant` Collection Type in order to create a restaurant.
+Execute a `POST` request on the `restaurant` collection type in order to create a restaurant.
-Be sure that you activated the `create` permission for the `restaurant` Collection Type and the `find` permission fot the `category` Collection type.
+Be sure that you activated the `create` permission for the `restaurant` collection type and the `find` permission fot the `category` Collection type.
In this example a `japanese` category has been created which has the id: 3.
@@ -644,9 +644,9 @@ export default App;
## PUT Request your collection type
-Execute a `PUT` request on the `restaurant` Collection Type in order to update the category of a restaurant.
+Execute a `PUT` request on the `restaurant` collection type in order to update the category of a restaurant.
-Be sure that you activated the `put` permission for the `restaurant` Collection Type.
+Be sure that you activated the `put` permission for the `restaurant` collection type.
::::: tabs card
@@ -724,6 +724,6 @@ fetch('http://localhost:1337/api/restaurants/2', {
## Conclusion
-Here is how to request your Collection Types in Strapi using React. When you create a Collection Type or a Single Type you will have a certain number of REST API endpoints available to interact with.
+Here is how to request your collection types in Strapi using React. When you create a collection type or a single type you will have a certain number of REST API endpoints available to interact with.
We just used the GET, POST and PUT methods here but you can [get one entry](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#get-an-entry), and [delete](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#delete-an-entry) an entry too. Learn more about [API Endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints).
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/ruby.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/ruby.md
index bcefffbaa7..6ce55c706a 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/ruby.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/ruby.md
@@ -41,9 +41,9 @@ bundle install
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
:::: api-call
::: request Example GET request
@@ -119,9 +119,9 @@ puts restaurant.all
## POST Request your collection type
-Execute a `POST` request on the `restaurant` Collection Type in order to create a restaurant.
+Execute a `POST` request on the `restaurant` collection type in order to create a restaurant.
-Be sure that you activated the `create` permission for the `restaurant` Collection Type and the `find` permission for the `category` Collection type.
+Be sure that you activated the `create` permission for the `restaurant` collection type and the `find` permission for the `category` Collection type.
In this example a `japanese` category has been created which has the id: 3.
@@ -210,9 +210,9 @@ puts restaurant.create({
## PUT Request your collection type
-Execute a `PUT` request on the `restaurant` Collection Type in order to update the category of a restaurant.
+Execute a `PUT` request on the `restaurant` collection type in order to update the category of a restaurant.
-Be sure that you activated the `put` permission for the `restaurant` Collection Type.
+Be sure that you activated the `put` permission for the `restaurant` collection type.
:::: api-call
::: request Example PUT request
@@ -304,4 +304,4 @@ puts restaurant.update(2, {categories: [2]})
## Conclusion
-Here is how to request your Collection Types in Strapi using Ruby. When you create a Collection Type or a Single Type you will have a certain number of REST API endpoints available to interact with.
+Here is how to request your collection types in Strapi using Ruby. When you create a collection type or a single type you will have a certain number of REST API endpoints available to interact with.
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/sapper.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/sapper.md
index 4059bec61f..531704a53f 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/sapper.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/sapper.md
@@ -48,9 +48,9 @@ No installation needed
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type
+Be sure that you activated the `find` permission for the `restaurant` collection type
::::: tabs card
@@ -227,9 +227,9 @@ onMount(async () => {
## POST Request your collection type
-Execute a `POST` request on the `restaurant` Collection Type in order to create a restaurant.
+Execute a `POST` request on the `restaurant` collection type in order to create a restaurant.
-Be sure that you activated the `create` permission for the `restaurant` Collection Type and the `find` permission fot the `category` Collection type.
+Be sure that you activated the `create` permission for the `restaurant` collection type and the `find` permission fot the `category` Collection type.
In this example a `japanese` category has been created which has the id: 3.
@@ -464,9 +464,9 @@ onMount(async () => {
## PUT Request your collection type
-Execute a `PUT` request on the `restaurant` Collection Type in order to update the category of a restaurant.
+Execute a `PUT` request on the `restaurant` collection type in order to update the category of a restaurant.
-Be sure that you activated the `put` permission for the `restaurant` Collection Type.
+Be sure that you activated the `put` permission for the `restaurant` collection type.
::::: tabs card
@@ -544,5 +544,5 @@ fetch('http://localhost:1337/api/restaurants/2', {
## Conclusion
-Here is how to request your Collection Types in Strapi using Sapper.
+Here is how to request your collection types in Strapi using Sapper.
Learn more about Svelte with their [official documentation](https://sapper.svelte.dev/docs)/
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/svelte.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/svelte.md
index 58aaebada1..3de23c827a 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/svelte.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/svelte.md
@@ -48,9 +48,9 @@ No installation needed
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
:::::: tabs card
@@ -225,9 +225,9 @@ onMount(async () => {
## POST Request your collection type
-Execute a `POST` request on the `restaurant` Collection Type in order to create a restaurant.
+Execute a `POST` request on the `restaurant` collection type in order to create a restaurant.
-Be sure that you activated the `create` permission for the `restaurant` Collection Type and the `find` permission for the `category` Collection type.
+Be sure that you activated the `create` permission for the `restaurant` collection type and the `find` permission for the `category` Collection type.
In this example a `japanese` category has been created which has the id: 3.
@@ -464,9 +464,9 @@ onMount(async () => {
## PUT Request your collection type
-Execute a `PUT` request on the `restaurant` Collection Type in order to update the category of a restaurant.
+Execute a `PUT` request on the `restaurant` collection type in order to update the category of a restaurant.
-Be sure that you activated the `put` permission for the `restaurant` Collection Type.
+Be sure that you activated the `put` permission for the `restaurant` collection type.
::::: tabs card
@@ -544,5 +544,5 @@ fetch('http://localhost:1337/api/restaurants/2', {
## Conclusion
-Here is how to request your Collection Types in Strapi using Svelte.
+Here is how to request your collection types in Strapi using Svelte.
Learn more about Svelte with their [official tutorial](https://svelte.dev/tutorial/basics).
diff --git a/docs/developer-docs/latest/developer-resources/content-api/integrations/vue-js.md b/docs/developer-docs/latest/developer-resources/content-api/integrations/vue-js.md
index f4fa7d4d45..3d1f7590eb 100644
--- a/docs/developer-docs/latest/developer-resources/content-api/integrations/vue-js.md
+++ b/docs/developer-docs/latest/developer-resources/content-api/integrations/vue-js.md
@@ -44,9 +44,9 @@ No installation needed
## GET Request your collection type
-Execute a `GET` request on the `restaurant` Collection Type in order to fetch all your restaurants.
+Execute a `GET` request on the `restaurant` collection type in order to fetch all your restaurants.
-Be sure that you activated the `find` permission for the `restaurant` Collection Type.
+Be sure that you activated the `find` permission for the `restaurant` collection type.
::::: tabs card
@@ -135,7 +135,7 @@ fetch('http://localhost:1337/api/restaurants', {
@@ -155,7 +155,7 @@ export default {
async mounted () {
try {
const response = await axios.get('http://localhost:1337/api/restaurants')
- this.restaurants = response.data
+ this.restaurants = response.data.data
} catch (error) {
this.error = error;
}
@@ -230,9 +230,9 @@ export default {
## POST Request your collection type
-Execute a `POST` request on the `restaurant` Collection Type in order to create a restaurant.
+Execute a `POST` request on the `restaurant` collection type in order to create a restaurant.
-Be sure that you activated the `create` permission for the `restaurant` Collection Type and the `find` permission for the `category` Collection type.
+Be sure that you activated the `create` permission for the `restaurant` collection type and the `find` permission for the `category` Collection type.
In this example a `japanese` category has been created which has the id: 3.
@@ -499,9 +499,9 @@ export default {
## PUT Request your collection type
-Execute a `PUT` request on the `restaurant` Collection Type in order to update the category of a restaurant.
+Execute a `PUT` request on the `restaurant` collection type in order to update the category of a restaurant.
-Be sure that you activated the `put` permission for the `restaurant` Collection Type.
+Be sure that you activated the `put` permission for the `restaurant` collection type.
::::: tabs card
@@ -580,6 +580,6 @@ fetch('http://localhost:1337/api/restaurants/2', {
## Conclusion
-Here is how to request your Collection Types in Strapi using Vue.js. When you create a Collection Type or a Single Type you will have a certain number of REST API endpoints available to interact with.
+Here is how to request your collection types in Strapi using Vue.js. When you create a collection type or a single type you will have a certain number of REST API endpoints available to interact with.
We just used the GET, POST and PUT methods here but you can [get one entry](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#get-an-entry), and [delete](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#delete-an-entry) an entry too. Learn more about [API Endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints).
diff --git a/docs/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md b/docs/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md
index f862ad8a8d..caef72f791 100644
--- a/docs/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md
+++ b/docs/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md
@@ -99,7 +99,7 @@ For each Content-Type, the following endpoints are automatically generated:
:::: tabs card
-::: tab Collection Type
+::: tab Collection type
@@ -115,7 +115,7 @@ For each Content-Type, the following endpoints are automatically generated:
:::
-::: tab Single Type
+::: tab Single type
@@ -135,9 +135,9 @@ For each Content-Type, the following endpoints are automatically generated:
:::: tabs card
-::: tab Collection Type
+::: tab Collection type
-`Restaurant` **Content Type**
+`Restaurant` **Content type**
@@ -153,9 +153,9 @@ For each Content-Type, the following endpoints are automatically generated:
:::
-::: tab Single Type
+::: tab Single type
-`Homepage` **Content Type**
+`Homepage` **Content type**
diff --git a/docs/developer-docs/latest/developer-resources/database-apis-reference/rest/filtering-locale-publication.md b/docs/developer-docs/latest/developer-resources/database-apis-reference/rest/filtering-locale-publication.md
index 0c74f6f6d3..cbd79787ed 100644
--- a/docs/developer-docs/latest/developer-resources/database-apis-reference/rest/filtering-locale-publication.md
+++ b/docs/developer-docs/latest/developer-resources/database-apis-reference/rest/filtering-locale-publication.md
@@ -146,7 +146,7 @@ await request(`/api/restaurants?${query}`);
::::
:::caution
-By default, the filters can only be used from `find` endpoints generated by the Content-Type Builder and the CLI.
+By default, the filters can only be used from `find` endpoints generated by the Content-type Builder and the CLI.
:::
### Complex filtering
diff --git a/docs/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md b/docs/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md
index 7432ba6fa3..dda17d1fc0 100644
--- a/docs/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md
+++ b/docs/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md
@@ -187,6 +187,10 @@ The Admin Panel API allows a plugin to take advantage of several small APIs to p
| Inject a Component in an injection zone | [Injection Zones API](#injection-zones-api) | [`injectComponent()`](#injection-zones-api) | [`bootstrap()`](#register) |
| Register a hook | [Hooks API](#hooks-api) | [`registerHook()`](#hooks-api) | [`bootstrap()`](#bootstrap) |
+::: strapi Replacing the WYSIWYG
+The WYSIWYG editor can be replaced by taking advantage of the [register lifecycle](#register) (see [register a new field in the admin panel](/developer-docs/latest/guides/registering-a-field-in-admin.md)).
+:::
+
::: tip
The admin panel supports dotenv variables.
@@ -487,17 +491,17 @@ const MyCompo = () => {
createActionAllowedFields: [], // Array of fields that the user is allowed to edit
formErrors: {}, // Object errors
readActionAllowedFields: [], // Array of field that the user is allowed to edit
- slug: 'api::address.address', // Slug of the content type
+ slug: 'api::address.address', // Slug of the content-type
updateActionAllowedFields: [],
allLayoutData: {
components: {}, // components layout
- contentType: {}, // content type layout
+ contentType: {}, // content-type layout
},
initialData: {},
isCreatingEntry: true,
isSingleType: true,
status: 'resolved',
- layout: {}, // Current content type layout
+ layout: {}, // Current content-type layout
hasDraftAndPublish: true,
modifiedData: {},
onPublish: () => {},
diff --git a/docs/developer-docs/latest/developer-resources/plugin-api-reference/server.md b/docs/developer-docs/latest/developer-resources/plugin-api-reference/server.md
index 12cf5fa4ba..3e6f45cfbc 100644
--- a/docs/developer-docs/latest/developer-resources/plugin-api-reference/server.md
+++ b/docs/developer-docs/latest/developer-resources/plugin-api-reference/server.md
@@ -35,7 +35,7 @@ This function is called to load the plugin, even before the application is actua
**Example:**
```js
-// path ./strapi-server.js
+// path ./src/plugins/my-plugin/strapi-server.js
module.exports = () => ({
register({ strapi }) {
@@ -53,7 +53,7 @@ The [bootstrap](/developer-docs/latest/setup-deployment-guides/configurations/op
**Example:**
```js
-// path: ./strapi-server.js
+// path: ./src/plugins/my-plugin/strapi-server.js
module.exports = () => ({
bootstrap({ strapi }) {
@@ -71,7 +71,7 @@ The [destroy](/developer-docs/latest/setup-deployment-guides/configurations/opti
**Example:**
```js
-// path: ./strapi-server.js
+// path: ./src/plugins/my-plugin/strapi-server.js
module.exports = () => ({
destroy({ strapi }) {
@@ -94,7 +94,7 @@ module.exports = () => ({
**Example:**
```js
-// path: ./strapi-server.js
+// path: ./src/plugins/my-plugin/strapi-server.js or ./src/plugins/my-plugin/server/index.js
const config = require('./config');
@@ -112,9 +112,9 @@ module.exports = () => ({
## Backend customization
-### Content-Types
+### Content-types
-An object with the [Content-Types](/developer-docs/latest/development/backend-customization/models.md) the plugin provides.
+An object with the [content-types](/developer-docs/latest/development/backend-customization/models.md) the plugin provides.
**Type**: `Object`
@@ -125,7 +125,15 @@ Content-Types keys in the `contentTypes` object should re-use the `singularName`
**Example:**
```js
-// path: ./strapi-server.js
+// path: ./src/plugins/my-plugin/strapi-server.js
+
+"use strict";
+
+module.exports = require('./server');
+```
+
+```js
+// path: ./src/plugins/my-plugin/server/index.js
const contentTypes = require('./content-types');
@@ -135,7 +143,7 @@ module.exports = () => ({
```
```js
-// path: ./content-types/index.js
+// path: ./src/plugins/my-plugin/server/content-types/index.js
const contentTypeA = require('./content-type-a');
const contentTypeB = require('./content-type-b');
@@ -147,7 +155,7 @@ module.exports = {
```
```js
-// path: ./content-types/content-type-a.js
+// path: ./src/plugins/my-plugin/server/content-types/content-type-a.js
module.exports = {
info: {
@@ -155,7 +163,7 @@ module.exports = {
singularName: 'content-type-a', // kebab-case mandatory
pluralName: 'content-type-as', // kebab-case mandatory
displayName: 'Content Type A',
- description: 'A regular content type',
+ description: 'A regular content-type',
kind: 'collectionType',
},
options: {
@@ -189,18 +197,26 @@ An array of [routes](/developer-docs/latest/development/backend-customization/ro
**Example:**
```js
-// path: ./strapi-server.js
+// path: ./src/plugins/my-plugin/strapi-server.js
+
+"use strict";
+
+module.exports = require('./server');
+```
+
+```js
+// path: ./src/plugins/my-plugin/server/index.js
const routes = require('./routes');
module.exports = () => ({
routes,
- type: 'content-api', // can also be 'admin-api' depending on the type of route
+ type: 'content-api', // can also be 'admin' depending on the type of route
});
```
```js
-// path: ./routes/index.js
+// path: ./src/plugins/my-plugin/server/routes/index.js
module.exports = [
{
@@ -222,8 +238,17 @@ An object with the [controllers](/developer-docs/latest/development/backend-cust
**Example:**
+
+```js
+// path: ./src/plugins/my-plugin/strapi-server.js
+
+"use strict";
+
+module.exports = require('./server');
+```
+
```js
-// path: ./strapi-server.js
+// path: ./src/plugins/my-plugin/server/index.js
const controllers = require('./controllers');
@@ -233,7 +258,7 @@ module.exports = () => ({
```
```js
-// path: ./controllers/index.js
+// path: ./src/plugins/my-plugin/server/controllers/index.js
const controllerA = require('./controller-a');
const controllerB = require('./controller-b');
@@ -245,7 +270,7 @@ module.exports = {
```
```js
-// path: ./controllers/controller-a.js
+// path: ./src/plugins/my-plugin/server/controllers/controller-a.js
module.exports = ({ strapi }) => ({
doSomething(ctx) {
@@ -265,7 +290,15 @@ Services should be functions taking `strapi` as a parameter.
**Example:**
```js
-// path: ./strapi-server.js
+// path: ./src/plugins/my-plugin/strapi-server.js
+
+"use strict";
+
+module.exports = require('./server');
+```
+
+```js
+// path: ./src/plugins/my-plugin/server/index.js
const services = require('./services');
@@ -275,7 +308,7 @@ module.exports = () => ({
```
```js
-// path: ./services/index.js
+// path: ./src/plugins/my-plugin/server/services/index.js
const serviceA = require('./service-a');
const serviceB = require('./service-b');
@@ -287,7 +320,7 @@ module.exports = {
```
```js
-// path: ./services/service-a.js
+// path: ./src/plugins/my-plugin/server/services/service-a.js
module.exports = ({ strapi }) => ({
someFunction() {
@@ -305,7 +338,15 @@ An object with the [policies](/developer-docs/latest/development/backend-customi
**Example:**
```js
-// path: ./strapi-server.js
+// path: ./src/plugins/my-plugin/strapi-server.js
+
+"use strict";
+
+module.exports = require('./server');
+```
+
+```js
+// path: ./src/plugins/my-plugin/server/index.js
const policies = require('./policies');
@@ -315,7 +356,7 @@ module.exports = () => ({
```
```js
-// path: ./policies/index.js
+// path: ./src/plugins/my-plugin/server/policies/index.js
const policyA = require('./policy-a');
const policyB = require('./policy-b');
@@ -327,7 +368,7 @@ module.exports = {
```
```js
-// path: ./policies/policy-a.js
+// path: ./src/plugins/my-plugin/server/policies/policy-a.js
module.exports = (policyContext, config, { strapi }) => {
if (ctx.state.user && ctx.state.user.isActive) {
@@ -348,7 +389,15 @@ An object with the [middlewares](/developer-docs/latest/setup-deployment-guides/
**Example:**
```js
-// path: ./strapi-server.js
+// path: ./src/plugins/my-plugin/strapi-server.js
+
+"use strict";
+
+module.exports = require('./server');
+```
+
+```js
+// path: ./src/plugins/my-plugin/server/index.js
const middlewares = require('./middlewares');
module.exports = () => ({
@@ -357,7 +406,7 @@ module.exports = () => ({
```
```js
-// path: ./middlewares/index.js
+// path: ./src/plugins/my-plugin/server/middlewares/index.js
const middlewareA = require('./middleware-a');
const middlewareB = require('./middleware-b');
@@ -369,7 +418,7 @@ module.exports = {
```
```js
-// path: ./middlewares/middleware-a.js
+// path: ./src/plugins/my-plugin/server/middlewares/middleware-a.js
module.exports = (options, { strapi }) => {
return async (ctx, next) => {
diff --git a/docs/developer-docs/latest/development/admin-customization.md b/docs/developer-docs/latest/development/admin-customization.md
index c4d259c01e..c9abb7f36f 100644
--- a/docs/developer-docs/latest/development/admin-customization.md
+++ b/docs/developer-docs/latest/development/admin-customization.md
@@ -81,7 +81,7 @@ module.exports = ({ env }) => ({
The `config` object found at `./src/admin/app.js` stores the admin panel configuration.
-Any file used by the `config` object (e.g. a custom logo) should be placed in the `./admin/extensions/` folder and imported inside `./src/admin/app.js`.
+Any file used by the `config` object (e.g. a custom logo) should be placed in the `./src/admin/extensions/` folder and imported inside `./src/admin/app.js`.
The `config` object accepts the following parameters:
@@ -99,7 +99,7 @@ The `config` object accepts the following parameters:
::: details Example of a custom configuration for the admin panel:
```jsx
-// path: ./admin/src/app.js
+// path: ./my-app/src/admin/app.js
import AuthLogo from './extensions/my-logo.png';
import MenuLogo from './extensions/logo.png';
@@ -162,48 +162,37 @@ To update the list of available locales in the admin panel, use the `config.loca
```jsx
// path: ./my-app/src/admin/app.js
-module.exports = {
- // Custom webpack config
- webpack: (config, webpack) => {
- // Note: we provide webpack above so you should not `require` it
- // Perform customizations to webpack config
- // Important: return the mutated config
- return config;
- },
-
- // App customizations
- app: config => {
- config.locales = ['ru', 'zh'];
-
- return config;
+export default {
+ config: {
+ locales: ['ru', 'zh']
},
-};
+ bootstrap() {},
+}
```
::: note NOTES
* The `en` locale cannot be removed from the build as it is both the fallback (i.e. if a translation is not found in a locale, the `en` will be used) and the default locale (i.e. used when a user opens the administration panel for the first time).
-* The full list of available locales is accessible on [Strapi's Github repo](https://github.com/strapi/strapi/blob/releases/v4/packages/plugins/i18n/server/constants/iso-locales.json).
+* The full list of available locales is accessible on [Strapi's Github repo](https://github.com/strapi/strapi/blob/v4.0.0/packages/plugins/i18n/server/constants/iso-locales.json).
:::
##### Extending translations
-Translation key/value pairs are declared in `./translations/[language-name].json` files. These keys can be extended through the `config.translations` key:
+Translation key/value pairs are declared in `@strapi/admin/admin/src/translations/[language-name].json` files. These keys can be extended through the `config.translations` key:
```js
-// path: ./src/admin/app.js
+// path: ./my-app/src/admin/app.js
export default {
config: {
locales: ['fr'],
translations: {
fr: {
- or: 'OR',
- 'request.error.model.unknown': "This model doesn't exist",
- skipToContent: 'Skip to content',
- submit: 'Submit',
- Totos: 'tata',
- "content-type-builder.my-translation-key": "test"
+ 'Auth.form.email.label': 'test',
+ Users: 'Utilisateurs',
+ City: 'CITY (FRENCH)',
+ // Customize the label of the Content Manager table.
+ Id: 'ID french',
},
},
},
@@ -211,7 +200,7 @@ export default {
};
```
-If more translations files should be added, place them in `/extensions/translations` folder.
+If more translations files should be added, place them in `./src/admin/extensions/translations` folder.
#### Logos
@@ -222,13 +211,13 @@ The Strapi admin panel displays a logo in 2 different locations, represented by
| On the login page | `config.auth.logo` |
| In the main navigation | `config.menu.logo` |
-To update the logos, put image files in the `./extensions` folder and update the corresponding keys.
+To update the logos, put image files in the `./src/admin/extensions` folder and update the corresponding keys.
The size of the custom image should be the same as the default one (434px x 120px).
#### Favicon
-To update the favicon, put a favicon file in the `./extensions` folder and update the `config.head.favicon` key in the [admin panel configuration](#configuration-options).
+To update the favicon, put a favicon file in the `./src/admin/extensions` folder and update the `config.head.favicon` key in the [admin panel configuration](#configuration-options).
#### Tutorial videos
@@ -299,7 +288,7 @@ module.exports = {
### Webpack configuration
-In order to extend the usage of webpack v5, define a function that extends its configuration inside `./admin/webpack.config.js`:
+In order to extend the usage of webpack v5, define a function that extends its configuration inside `./my-app/src/admin/webpack.config.js`:
```js
module.exports = {
@@ -316,7 +305,7 @@ module.exports = {
```
::: note
-Only `./admin/app.js` and the files under the `./admin/extensions` folder are being watched by the webpack dev server.
+Only `./src/admin/app.js` and the files under the `./src/admin/extensions` folder are being watched by the webpack dev server.
:::
## Extension
diff --git a/docs/developer-docs/latest/development/backend-customization/controllers.md b/docs/developer-docs/latest/development/backend-customization/controllers.md
index 75ee2a7922..afbba800f9 100644
--- a/docs/developer-docs/latest/development/backend-customization/controllers.md
+++ b/docs/developer-docs/latest/development/backend-customization/controllers.md
@@ -22,7 +22,7 @@ A new controller can be implemented:
- with the [interactive CLI command `strapi generate`](/developer-docs/latest/developer-resources/cli/CLI.md#strapi-generate)
- or manually by creating a JavaScript file:
- in `./src/api/[api-name]/controllers/` for API controllers (this location matters as controllers are auto-loaded by Strapi from there)
- - or in a folder like `./src/plugins/[plugin-name]/controllers/` for plugin controllers, though they can be created elsewhere as long as the plugin interface is properly exported in the `strapi-server.js` file (see [Server API for Plugins documentation](/developer-docs/latest/developer-resources/plugin-api-reference/server.md))
+ - or in a folder like `./src/plugins/[plugin-name]/server/controllers/` for plugin controllers, though they can be created elsewhere as long as the plugin interface is properly exported in the `strapi-server.js` file (see [Server API for Plugins documentation](/developer-docs/latest/developer-resources/plugin-api-reference/server.md))
```js
// path: ./src/api/restaurant/controllers/restaurant.js
diff --git a/docs/developer-docs/latest/development/backend-customization/models.md b/docs/developer-docs/latest/development/backend-customization/models.md
index e3714ad45b..651f277207 100644
--- a/docs/developer-docs/latest/development/backend-customization/models.md
+++ b/docs/developer-docs/latest/development/backend-customization/models.md
@@ -14,7 +14,7 @@ There are 2 different types of models in Strapi:
- content-types, which can be collection types or single types, depending on how many entries they manage,
- and components that are data structures re-usable in multiple content-types.
-If you are just starting out, it is convenient to generate some models with the [Content-Type Builder](/user-docs/latest/content-types-builder/introduction-to-content-types-builder.md) directly in the admin panel. The user interface takes over a lot of validation tasks and showcases all the options available to create the content's data structure. The generated model mappings can then be reviewed at the code level using this documentation.
+If you are just starting out, it is convenient to generate some models with the [Content-type Builder](/user-docs/latest/content-types-builder/introduction-to-content-types-builder.md) directly in the admin panel. The user interface takes over a lot of validation tasks and showcases all the options available to create the content's data structure. The generated model mappings can then be reviewed at the code level using this documentation.
## Model creation
@@ -24,7 +24,7 @@ Content-types and components models are created and stored differently.
Content-types in Strapi can be created:
-- with the [Content-Type Builder in the admin panel](/user-docs/latest/content-types-builder/introduction-to-content-types-builder.md),
+- with the [Content-type Builder in the admin panel](/user-docs/latest/content-types-builder/introduction-to-content-types-builder.md),
- or with [Strapi's interactive CLI `strapi generate`](/developer-docs/latest/developer-resources/cli/CLI.md#strapi-generate) command.
The content-types has the following models files:
@@ -36,7 +36,7 @@ These models files are stored in `./src/api/[api-name]/content-types/[content-ty
### Components
-Component models can't be created with CLI tools. Use the [Content-Type Builder](/user-docs/latest/content-types-builder/introduction-to-content-types-builder.md) or create them manually.
+Component models can't be created with CLI tools. Use the [Content-type Builder](/user-docs/latest/content-types-builder/introduction-to-content-types-builder.md) or create them manually.
Components models are stored in the `./src/components` folder. Every component has to be inside a subfolder, named after the category the component belongs to (see [project structure](/developer-docs/latest/setup-deployment-guides/file-structure.md)).
@@ -129,7 +129,7 @@ Basic validations can be applied to attributes using the following parameters:
| `minLength` | Integer | Minimum number of characters for a field input value | - |
| `maxLength` | Integer | Maximum number of characters for a field input value | - |
| `private` | Boolean | If `true`, the attribute will be removed from the server response.
💡 This is useful to hide sensitive data. | `false` |
-| `configurable` | Boolean | If `false`, the attribute isn't configurable from the Content-Type Builder plugin. | `true` |
+| `configurable` | Boolean | If `false`, the attribute isn't configurable from the Content-type Builder plugin. | `true` |
```json
// ./src/api/[api-name]/content-types/restaurant/schema.json
diff --git a/docs/developer-docs/latest/development/backend-customization/services.md b/docs/developer-docs/latest/development/backend-customization/services.md
index c9d77429df..9664730408 100644
--- a/docs/developer-docs/latest/development/backend-customization/services.md
+++ b/docs/developer-docs/latest/development/backend-customization/services.md
@@ -84,7 +84,7 @@ const transporter = nodemailer.createTransport({
},
});
-module.exports = createCoreService('api::restaurant.restaurant', ({ strapi }) => ({
+module.exports = createCoreService('api::restaurant.restaurant', ({ strapi }) => ({
send(from, to, subject, text) {
// Setup e-mail data.
const options = {
diff --git a/docs/developer-docs/latest/development/backend-customization/webhooks.md b/docs/developer-docs/latest/development/backend-customization/webhooks.md
index a02cd827f9..787c8e9c44 100644
--- a/docs/developer-docs/latest/development/backend-customization/webhooks.md
+++ b/docs/developer-docs/latest/development/backend-customization/webhooks.md
@@ -10,9 +10,9 @@ Webhook is a construct used by an application to notify other applications that
The way a webhook works is by delivering information to a receiving application through HTTP requests (typically POST requests).
-## User content type webhooks
+## User content-type webhooks
-To prevent from unintentionally sending any user's information to other applications, Webhooks will not work for the User content type.
+To prevent from unintentionally sending any user's information to other applications, Webhooks will not work for the User content-type.
If you need to notify other applications about changes in the Users collection, you can do so by creating [Lifecycle hooks](/developer-docs/latest/development/backend-customization/models.md#lifecycle-hooks) inside the file `./extensions/users-permissions/models/User.js`.
## Available configurations
diff --git a/docs/developer-docs/latest/development/plugins/graphql.md b/docs/developer-docs/latest/development/plugins/graphql.md
index 4108782bed..22c82435de 100644
--- a/docs/developer-docs/latest/development/plugins/graphql.md
+++ b/docs/developer-docs/latest/development/plugins/graphql.md
@@ -5,7 +5,7 @@ description: Use a GraphQL endpoint in your Strapi project to fetch and mutate y
# GraphQL
-By default Strapi create [REST endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints) for each of your content types. With the GraphQL plugin, you will be able to add a GraphQL endpoint to fetch and mutate your content.
+By default Strapi create [REST endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints) for each of your content-types. With the GraphQL plugin, you will be able to add a GraphQL endpoint to fetch and mutate your content.
## Usage
@@ -809,7 +809,7 @@ There is no custom resolver in that case, so it will execute the default resolve
### Link a query or mutation to a controller action
-By default, the plugin will execute the actions located in the controllers that have been generated via the Content-Type Builder plugin or the CLI. For example, the query `restaurants` is going to execute the logic inside the `find` action in the `Restaurant.js` controller. It might happen that you want to execute another action or a custom logic for one of your queries.
+By default, the plugin will execute the actions located in the controllers that have been generated via the Content-type Builder plugin or the CLI. For example, the query `restaurants` is going to execute the logic inside the `find` action in the `Restaurant.js` controller. It might happen that you want to execute another action or a custom logic for one of your queries.
```js
module.exports = {
diff --git a/docs/developer-docs/latest/getting-started/introduction.md b/docs/developer-docs/latest/getting-started/introduction.md
index 86d0fa2e3b..62d7089af8 100644
--- a/docs/developer-docs/latest/getting-started/introduction.md
+++ b/docs/developer-docs/latest/getting-started/introduction.md
@@ -12,7 +12,7 @@ This documentation contains all technical documentation related to the setup, de
You can directly head to the [Quick Start](quick-start.md)! If demos are more your thing, we have a [video demo](https://youtu.be/zd0_S_FPzKg), or you can request a [live demo](https://strapi.io/demo)!
:::
-The original purpose of the project was to help Boot**strap** your **API**: that's how Strapi was created. Now, Strapi is an open-source headless CMS that gives developers the freedom to choose their favorite tools and frameworks and allows editors to manage and distribute their content using their application's admin panel. Based on a plugin system, Strapi is a flexible CMS whose admin panel and API are extensible - and which every part is customizable to match any use case. Strapi also has a built-in user system to manage in detail what the administrators and end-users have access to.
+The original purpose of the project was to help Boot**strap** your **API**: that's how Strapi was created. Now, Strapi is an open-source headless CMS that gives developers the freedom to choose their favorite tools and frameworks and allows editors to manage and distribute their content using their application's admin panel. Based on a plugin system, Strapi is a flexible CMS whose admin panel and API are extensible - and which every part is customizable to match any use case. Strapi also has a built-in user system to manage in detail what the administrators and end users have access to.
## Open-source & Contribution
diff --git a/docs/developer-docs/latest/getting-started/quick-start.md b/docs/developer-docs/latest/getting-started/quick-start.md
index cb3a82e365..cd0a713277 100644
--- a/docs/developer-docs/latest/getting-started/quick-start.md
+++ b/docs/developer-docs/latest/getting-started/quick-start.md
@@ -149,15 +149,15 @@ The admin panel of Strapi runs at [http://localhost:1337/admin](http://localhost
If the server is not already running, in your terminal, `cd` into the `my-project` folder and run `npm run develop` (or `yarn develop`) to launch it.
:::
-### Step 1: Create collection types with the Content-Type Builder
+### Step 1: Create collection types with the Content-type Builder
-The Content-Type Builder plugin helps you create your data structure. When creating an empty project with Strapi, this is where to get the party started!
+The Content-type Builder plugin helps you create your data structure. When creating an empty project with Strapi, this is where to get the party started!
#### Create a "Restaurant" collection type
Your restaurants directory will eventually include many restaurants, so we need to create a "Restaurant" collection type. Then we can describe the fields to display when adding a new restaurant entry:
-1. Go to Plugins  [Content-Type Builder](http://localhost:1337/admin/plugins/content-type-builder) in the main navigation.
+1. Go to Plugins  [Content-type Builder](http://localhost:1337/admin/plugins/content-type-builder) in the main navigation.
2. Click on **Create new collection type**.
3. Type `Restaurant` for the _Display name_, and click **Continue**.
4. Click the Text field.
@@ -168,15 +168,15 @@ Your restaurants directory will eventually include many restaurants, so we need
9. Type `description` under the _Name_ field, then click **Finish**.
10. Finally, click **Save** and wait for Strapi to restart.
-
+
-Once Strapi has restarted, "Restaurant" is listed under  _Content Manager > Collection types_ in the navigation. Wow, you have just created your very first content type! It was so cool — let's create another one right now, just for pleasure.
+Once Strapi has restarted, "Restaurant" is listed under  _Content Manager > Collection types_ in the navigation. Wow, you have just created your very first content-type! It was so cool — let's create another one right now, just for pleasure.
#### Create a "Category" collection type
It would help getting a bit more organized if our restaurants directory had some categories. Let's create a "Category" collection type:
-1. Go to Plugins  [Content-Type Builder](http://localhost:1337/admin/plugins/content-type-builder) in the main navigation.
+1. Go to Plugins  [Content-type Builder](http://localhost:1337/admin/plugins/content-type-builder) in the main navigation.
2. Click on **Create new collection type**.
3. Type `Category` for the _Display name_, and click **Continue**.
4. Click the Text field.
@@ -213,9 +213,9 @@ Let's go to 
@@ -314,7 +314,7 @@ Now that you know the basics of creating and publishing content with Strapi, we
## 🚀 Part A: Create a new project with Strapi starters
-Strapi [starters](https://strapi.io/starters) are the fastest way to kickstart your project. They cover many use cases (blog, e-commerce solution, corporate website, portfolio) and integrate with various technologies (Next, Gridsome, Next, Nuxt).
+Strapi [starters](https://strapi.io/starters) are the fastest way to kickstart your project. They cover many use cases (blog, e-commerce solution, corporate website, portfolio) and integrate with various technologies (Next, Gridsome, Nuxt).
This quick start guide has been specifically tailored to use the [Next blog starter](https://strapi.io/starters/strapi-starter-next-js-blog). We highly recommend you to follow along with this starter. Once you get a better understanding of Strapi, you will be able to play with other starters on your own.
diff --git a/docs/developer-docs/latest/getting-started/troubleshooting.md b/docs/developer-docs/latest/getting-started/troubleshooting.md
index 078dee50c4..cf61b68872 100644
--- a/docs/developer-docs/latest/getting-started/troubleshooting.md
+++ b/docs/developer-docs/latest/getting-started/troubleshooting.md
@@ -28,9 +28,9 @@ Strapi does not currently provide any tools for migrating or deploying your data
## User can't login to the admin panel
-With the release of the Strapi beta version a fundamental change occurred in that the "end-users" (REST and GraphQL users) were split from the Administrators (admin panel users) in such a way that normal users can not be given access to the admin panel. If you would like to read more on why this change was done, you can read the Strapi [blog post](https://strapi.io/blog/why-we-split-the-management-of-the-admin-users-and-end-users) about it.
+With the release of the Strapi beta version a fundamental change occurred in that the end users (REST and GraphQL users) were split from the Administrators (admin panel users) in such a way that normal users can not be given access to the admin panel. If you would like to read more on why this change was done, you can read the Strapi [blog post](https://strapi.io/blog/why-we-split-the-management-of-the-admin-users-and-end-users) about it.
-Strapi has released the new Admin & Permissions (RBAC - Role based access control) that does allow for some degree of control over what users can access within the admin panel and includes some field level permissions. You can now also give roles specific permissions for things like content-types, single-types, plugins, and settings.
+Strapi has released the new Admin & Permissions (RBAC - Role based access control) that does allow for some degree of control over what users can access within the admin panel and includes some field level permissions. You can now also give roles specific permissions for things like content-types, single types, plugins, and settings.
When this new plugin release, there is two versions:
diff --git a/docs/developer-docs/latest/guides/auth-request.md b/docs/developer-docs/latest/guides/auth-request.md
index 9fffff9c77..0b10f8ba17 100644
--- a/docs/developer-docs/latest/guides/auth-request.md
+++ b/docs/developer-docs/latest/guides/auth-request.md
@@ -24,7 +24,7 @@ We will have one group of users that will be able to only fetch **Articles** and
Lets create a new Content Type **Article**
-- Click on `Content-Type Builder` in the left menu
+- Click on `Content-type Builder` in the left menu
- Then `+ Create new content-type`
- Fill `Display name` with `article`
- Create 2 fields
diff --git a/docs/developer-docs/latest/guides/custom-admin.md b/docs/developer-docs/latest/guides/custom-admin.md
index e921634d55..fc0f13c190 100644
--- a/docs/developer-docs/latest/guides/custom-admin.md
+++ b/docs/developer-docs/latest/guides/custom-admin.md
@@ -14,7 +14,7 @@ In this guide we will see how you can customize the admin panel.
For this example, we will see two things:
1. The customization of the admin panel itself, by updating the content of the `/admin/` home page;
-2. How to update the interface of a plugin, by replacing the `date` format in the content manager list view.
+2. How to update the interface of a plugin, by replacing the `date` format in the Content Manager list view.
First, you will have to read about [admin panel customization](/developer-docs/latest/development/admin-customization.md), it will help you understand how to customize all of your application.
@@ -136,7 +136,7 @@ npm run develop -- --watch-admin
::::
-If you visit the entry list view of your content type, nothing will have changed. And it's normal!
+If you visit the entry list view of your content-type, nothing will have changed. And it's normal!
### Customize the file
diff --git a/docs/developer-docs/latest/guides/custom-data-response.md b/docs/developer-docs/latest/guides/custom-data-response.md
index 9c6200d28b..fc33858a19 100644
--- a/docs/developer-docs/latest/guides/custom-data-response.md
+++ b/docs/developer-docs/latest/guides/custom-data-response.md
@@ -14,9 +14,9 @@ In this guide we will see how you can customize your API's response.
To be able to update the default data response you have first to understand how it works.
-When you create a content type, it generates an API with the following list of [endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints).
+When you create a content-type, it generates an API with the following list of [endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints).
-Each of these endpoint triggers a controller action. Here is the list of [controller actions](/developer-docs/latest/development/backend-customization/controllers.md) that exist by default when a content type is created.
+Each of these endpoint triggers a controller action. Here is the list of [controller actions](/developer-docs/latest/development/backend-customization/controllers.md) that exist by default when a content-type is created.
If you check the controller file of your generated API `./api/{content-type}/controller/{Content-Type}.js`, you will see an empty file. It is because all the default logic is managed by Strapi. But you can override these actions with your own code.
@@ -29,7 +29,7 @@ Let's consider you don't want to expose the chef's email for privacy reasons.
To enforce this rule we will customize the action that fetches all restaurants and remove the email from the returned data.
-To follow the example you will have to create a content type `restaurant` and add the following field definition:
+To follow the example you will have to create a content-type `restaurant` and add the following field definition:
- `string` attribute named `name`
- `text` attribute named `description`
diff --git a/docs/developer-docs/latest/guides/draft.md b/docs/developer-docs/latest/guides/draft.md
index 9ebe886a5b..e90d0a6892 100644
--- a/docs/developer-docs/latest/guides/draft.md
+++ b/docs/developer-docs/latest/guides/draft.md
@@ -22,9 +22,9 @@ But we don't want to use [parameters](/developer-docs/latest/developer-resources
To be able to do that, you have first to understand some concepts.
-When you create a content type, it generates an API with the following list of [endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints).
+When you create a content-type, it generates an API with the following list of [endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints).
-Each of these endpoint triggers a controller action. Here is the list of [controller actions](/developer-docs/latest/development/backend-customization/controllers.md) that exist by default when a content type is created.
+Each of these endpoint triggers a controller action. Here is the list of [controller actions](/developer-docs/latest/development/backend-customization/controllers.md) that exist by default when a content-type is created.
If you check the controller file of your generated API `./api/{content-type}/controller/{Content-Type}.js`, you will see an empty file. It is because all the default logic is managed by Strapi. But you can override these actions with your own code.
@@ -32,12 +32,12 @@ And that is what we will do to filter to `published` status by default.
## Example
-In our example we will use an Article content type. By default, when you fetch articles you will get all articles.
+In our example we will use an Article content-type. By default, when you fetch articles you will get all articles.
Let's consider you don't want to expose articles that are in `draft` or `archive` status.
To enforce this rule we will customize the action that fetches all articles to just fetch `published` articles.
-To follow the example you will have to create a content type `articles` and add the following field definitions:
+To follow the example you will have to create a content-type `articles` and add the following field definitions:
- `string` attribute named `title`
- `text` attribute named `content`
diff --git a/docs/developer-docs/latest/guides/registering-a-field-in-admin.md b/docs/developer-docs/latest/guides/registering-a-field-in-admin.md
index 69b8928569..6a396c72a5 100644
--- a/docs/developer-docs/latest/guides/registering-a-field-in-admin.md
+++ b/docs/developer-docs/latest/guides/registering-a-field-in-admin.md
@@ -6,203 +6,168 @@ canonicalUrl: https://docs.strapi.io/developer-docs/latest/guides/registering-a-
# Creating a new Field in the administration panel
-!!!include(developer-docs/latest/guides/snippets/guide-not-updated.md)!!!
-
In this guide we will see how you can create a new Field for your administration panel.
-## Introduction
-
-For this example, we will see how to change the WYSIWYG with [CKEditor](https://ckeditor.com/ckeditor-5/) in the **`Content Manager`** plugin by creating a new plugin which will add a new **Field** in your application.
+For this example, we will see how to change the WYSIWYG with [CKEditor](https://ckeditor.com/ckeditor-5/) in the Content Manager plugin by creating a new plugin that will add a new field in your application.
-## Setup
+## Setting up the plugin
1. Create a new project:
-:::: tabs card
-
-::: tab yarn
-
-```
-# Create an application using SQLite and prevent the server from starting automatically as we will create a plugin
-# right after the project generation
-yarn create strapi-app my-app --quickstart --no-run
-```
-
-:::
-
-::: tab npx
-
-```
-# Create an application using SQLite and prevent the server from starting automatically as we will create a plugin
-# right after the project generation
-npx create-strapi-app@latest my-app --quickstart --no-run
-```
-
-:::
-
-::::
-
-2. Generate a plugin:
-
-:::: tabs card
+ :::: tabs card
-::: tab yarn
+ ::: tab yarn
-```
-cd my-app
-yarn strapi generate:plugin wysiwyg
-```
+ Create an application and prevent the server from starting automatically with the following command:
-:::
+ ```
+ yarn create strapi-app my-app --quickstart --no-run
+ ```
-::: tab npm
+ The `--no-run` flag was added as we will run additional commands to create a plugin right after the project generation.
-```
-cd my-app
-npm run strapi generate:plugin wysiwyg
-```
+ :::
-:::
+ ::: tab npx
-::: tab strapi
+ Create an application and prevent the server from starting automatically with the following command:
-```
-cd my-app
-strapi generate:plugin wysiwyg
-```
-
-:::
-
-::::
-
-3. Install the needed dependencies:
-
-:::: tabs card
-
-::: tab yarn
-
-```
-cd plugins/wysiwyg
-yarn add @ckeditor/ckeditor5-react @ckeditor/ckeditor5-build-classic
-```
+ ```
+ npx create-strapi-app@latest my-app --quickstart --no-run
+ ```
-:::
+ The `--no-run` flag was added as we will run additional commands to create a plugin right after the project generation.
-::: tab npm
+ :::
-```
-cd plugins/wysiwyg
-npm install @ckeditor/ckeditor5-react @ckeditor/ckeditor5-build-classic
-```
+ ::::
-:::
+2. Generate a plugin:
-::::
+ :::: tabs card
-4. Start your application with the front-end development mode:
+ ::: tab yarn
-:::: tabs card
+ ```
+ cd my-app
+ yarn strapi generate
+ ```
-::: tab yarn
+ Choose "plugin" from the list, press Enter and name the plugin `wysiwyg`.
-```
-# Go back to to strapi root folder
-cd ../..
-yarn develop --watch-admin
-```
+ :::
-:::
+ ::: tab npm
-::: tab npm
+ ```
+ cd my-app
+ npm run strapi generate
+ ```
+ Choose "plugin" from the list, press Enter and name the plugin `wysiwyg`.
-```
-# Go back to to strapi root folder
-cd ../..
-npm run develop -- --watch-admin
-```
+ :::
-:::
+ ::::
-::: tab strapi
+3. Enable the plugin by adding it to the [plugins configurations](/developer-docs/latest/setup-deployment-guides/configurations/optional/plugins.md) file:
-```
-# Go back to to strapi root folder
-cd ../..
-strapi develop --watch-admin
-```
+ ```js
+ // path: ./config/plugins.js
+ module.exports = {
+ // ...
+ 'wysiwyg': {
+ enabled: true,
+ resolve: './src/plugins/wysiwyg' // path to plugin folder
+ },
+ // ...
+ }
+ ```
+
+4. Install the required dependencies:
+
+
+
+ ```bash
+ cd src/plugins/wysiwyg
+ yarn add @ckeditor/ckeditor5-react @ckeditor/ckeditor5-build-classic
+ ```
+
+
+
+ ```bash
+ cd src/plugins/wysiwyg
+ npm install @ckeditor/ckeditor5-react @ckeditor/ckeditor5-build-classic
+ ```
+
+
+
+5. Start the application with the front-end development mode:
+
+
+
+ ```bash
+ # Go back to the application root folder
+ cd ../../..
+ yarn develop --watch-admin
+ ```
+
+
+
+ ```bash
+ # Go back to the application root folder
+ cd ../../..
+ npm run develop -- --watch-admin
+ ```
+
+
+
+::: note NOTE
+Launching the Strapi server in watch mode without creating a user account first will open `localhost:1337` with a JSON format error. Creating a user on `localhost:8081` prevents this alert.
:::
-::::
+Once this step is over all we need to do is to create our new WYSIWYG, which will replace the default one in the Content Manager plugin.
-Once this step is over all we need to do is to create our new WYSIWYG which will replace the default one in the **Content Manager** plugin.
+## Creating the WYSIWYG
-### Creating the WYSIWYG
+In this part we will create 3 components:
-In this part we will create three components:
+- a `MediaLib` component used to insert media in the editor
+- an `Editor` component that uses [CKEditor](https://ckeditor.com/) as the WYSIWYG editor
+- a `Wysiwyg` component to wrap the CKEditor
-- MediaLib which will be used to insert media in the editor
-- Wysiwyg which will wrap the CKEditor with a label and the errors
-- CKEditor which will be the implementation of the new WYSIWYG
+The following code examples can be used to implement the logic for the 3 components:
-### Creating the MediaLib
-
-**Path —** `./plugins/wysiwyg/admin/src/components/MediaLib/index.js`
+::: details Example of a MediaLib component used to insert media in the editor:
```js
-import React, { useEffect, useState } from 'react';
-import { useStrapi, prefixFileUrlWithBackendUrl } from 'strapi-helper-plugin';
+// path: ./src/plugins/wysiwyg/admin/src/components/MediaLib/index.js
+
+import React from 'react';
+import { prefixFileUrlWithBackendUrl, useLibrary } from '@strapi/helper-plugin';
import PropTypes from 'prop-types';
const MediaLib = ({ isOpen, onChange, onToggle }) => {
- const {
- strapi: {
- componentApi: { getComponent },
- },
- } = useStrapi();
- const [data, setData] = useState(null);
- const [isDisplayed, setIsDisplayed] = useState(false);
-
- useEffect(() => {
- if (isOpen) {
- setIsDisplayed(true);
- }
- }, [isOpen]);
-
- const Component = getComponent('media-library').Component;
+ const { components } = useLibrary();
+ const MediaLibraryDialog = components['media-library'];
- const handleInputChange = data => {
- if (data) {
- const { url } = data;
+ const handleSelectAssets = files => {
+ const formattedFiles = files.map(f => ({
+ alt: f.alternativeText || f.name,
+ url: prefixFileUrlWithBackendUrl(f.url),
+ mime: f.mime,
+ }));
- setData({ ...data, url: prefixFileUrlWithBackendUrl(url) });
- }
+ onChange(formattedFiles);
};
- const handleClosed = () => {
- if (data) {
- onChange(data);
- }
-
- setData(null);
- setIsDisplayed(false);
+ if(!isOpen) {
+ return null
};
- if (Component && isDisplayed) {
- return (
-
- );
- }
-
- return null;
+ return(
+
+ );
};
MediaLib.defaultProps = {
@@ -219,127 +184,27 @@ MediaLib.propTypes = {
export default MediaLib;
```
+:::
-#### Creating the WYSIWYG Wrapper
-
-**Path —** `./plugins/wysiwyg/admin/src/components/Wysiwyg/index.js`
+::: details Example of an Editor component using CKEditor as the WYSIWYG editor:
```js
-import React, { useState } from 'react';
-import PropTypes from 'prop-types';
-import { isEmpty } from 'lodash';
-import { Button } from '@buffetjs/core';
-import { Label, InputDescription, InputErrors } from 'strapi-helper-plugin';
-import Editor from '../CKEditor';
-import MediaLib from '../MediaLib';
-
-const Wysiwyg = ({
- inputDescription,
- errors,
- label,
- name,
- noErrorsDescription,
- onChange,
- value,
-}) => {
- const [isOpen, setIsOpen] = useState(false);
- let spacer = !isEmpty(inputDescription) ? : ;
-
- if (!noErrorsDescription && !isEmpty(errors)) {
- spacer = ;
- }
+// path: ./src/plugins/wysiwyg/admin/src/components/Editor/index.js
- const handleChange = data => {
- if (data.mime.includes('image')) {
- const imgTag = `
`;
- const newValue = value ? `${value}${imgTag}` : imgTag;
-
- onChange({ target: { name, value: newValue } });
- }
-
- // Handle videos and other type of files by adding some code
- };
-
- const handleToggle = () => setIsOpen(prev => !prev);
-
- return (
-
-
-
-
-
-
-
-
- {spacer}
-
-
- );
-};
-
-Wysiwyg.defaultProps = {
- errors: [],
- inputDescription: null,
- label: '',
- noErrorsDescription: false,
- value: '',
-};
-
-Wysiwyg.propTypes = {
- errors: PropTypes.array,
- inputDescription: PropTypes.oneOfType([
- PropTypes.string,
- PropTypes.func,
- PropTypes.shape({
- id: PropTypes.string,
- params: PropTypes.object,
- }),
- ]),
- label: PropTypes.oneOfType([
- PropTypes.string,
- PropTypes.func,
- PropTypes.shape({
- id: PropTypes.string,
- params: PropTypes.object,
- }),
- ]),
- name: PropTypes.string.isRequired,
- noErrorsDescription: PropTypes.bool,
- onChange: PropTypes.func.isRequired,
- value: PropTypes.string,
-};
-
-export default Wysiwyg;
-```
-
-#### Implementing CKEditor
-
-**Path —** `./plugins/wysiwyg/admin/src/components/CKEditor/index.js`
-
-```js
import React from 'react';
import PropTypes from 'prop-types';
+import styled from 'styled-components';
import { CKEditor } from '@ckeditor/ckeditor5-react';
import ClassicEditor from '@ckeditor/ckeditor5-build-classic';
-import styled from 'styled-components';
+import { Box } from '@strapi/design-system/Box';
-const Wrapper = styled.div`
+const Wrapper = styled(Box)`
.ck-editor__main {
- min-height: 200px;
+ min-height: ${200 / 16}em;
> div {
- min-height: 200px;
+ min-height: ${200 / 16}em;
}
+ // Since Strapi resets css styles, it can be configured here (h2, h3, strong, i, ...)
}
`;
@@ -364,14 +229,15 @@ const configuration = {
],
};
-const Editor = ({ onChange, name, value }) => {
+const Editor = ({ onChange, name, value, disabled }) => {
return (
editor.setData(value)}
+ data={value || ''}
+ onReady={editor => editor.setData(value || '')}
onChange={(event, editor) => {
const data = editor.getData();
onChange({ target: { name, value: data } });
@@ -381,89 +247,158 @@ const Editor = ({ onChange, name, value }) => {
);
};
+Editor.defaultProps = {
+ value: '',
+ disabled: false
+};
+
Editor.propTypes = {
onChange: PropTypes.func.isRequired,
name: PropTypes.string.isRequired,
value: PropTypes.string,
+ disabled: PropTypes.bool
};
export default Editor;
```
-At this point we have simply created a new plugin which is mounted in our project but our custom **Field** has not been registered yet.
+:::
-### Registering a our new Field
+::: details Example of a Wysiwyg component wrapping CKEditor:
-Since the goal of our plugin is to override the current WYSIWYG we don't want it to be displayed in the administration panel but we need it to register our new **Field**.
-In order to do so, we will simply **modify** the front-end entry point of our plugin.
+```js
+// path: ./src/plugins/wysiwyg/admin/src/components/Wysiwyg/index.js
-This file is already present. Please replace the content of this file with the following:
+import React, { useState } from 'react';
+import PropTypes from 'prop-types';
+import { Stack } from '@strapi/design-system/Stack';
+import { Box } from '@strapi/design-system/Box';
+import { Button } from '@strapi/design-system/Button';
+import { Typography } from '@strapi/design-system/Typography';
+import Landscape from '@strapi/icons/Landscape';
+import MediaLib from '../MediaLib';
+import Editor from '../Editor';
+import { useIntl } from 'react-intl';
-**Path —** `./plugins/wysiwyg/admin/src/index.js`
+const Wysiwyg = ({ name, onChange, value, intlLabel, disabled, error, description, required }) => {
+ const { formatMessage } = useIntl();
+ const [mediaLibVisible, setMediaLibVisible] = useState(false);
-```js
-import pluginPkg from '../../package.json';
-import Wysiwyg from './components/Wysiwyg';
-import pluginId from './pluginId';
-
-export default strapi => {
- const pluginDescription = pluginPkg.strapi.description || pluginPkg.description;
-
- const plugin = {
- blockerComponent: null,
- blockerComponentProps: {},
- description: pluginDescription,
- icon: pluginPkg.strapi.icon,
- id: pluginId,
- initializer: () => null,
- injectedComponents: [],
- isReady: true,
- isRequired: pluginPkg.strapi.required || false,
- mainComponent: null,
- name: pluginPkg.strapi.name,
- preventComponentRendering: false,
- settings: null,
- trads: {},
- };
+ const handleToggleMediaLib = () => setMediaLibVisible(prev => !prev);
- strapi.registerField({ type: 'wysiwyg', Component: Wysiwyg });
+ const handleChangeAssets = assets => {
+ let newValue = value ? value : '';
- return strapi.registerPlugin(plugin);
-};
-```
+ assets.map(asset => {
+ if (asset.mime.includes('image')) {
+ const imgTag = `
`;
-Finally you will have to rebuild strapi so the new plugin is loaded correctly:
+ newValue = `${newValue}${imgTag}`
+ }
-:::: tabs card
+ // Handle videos and other type of files by adding some code
+ });
-::: tab yarn
+ onChange({ target: { name, value: newValue } });
+ handleToggleMediaLib();
+ };
+
+ return (
+ <>
+
+
+
+ {formatMessage(intlLabel)}
+
+ {required &&
+ *
+ }
+
+ } variant='secondary' fullWidth onClick={handleToggleMediaLib}>Media library
+
+ {error &&
+
+ {formatMessage({ id: error, defaultMessage: error })}
+
+ }
+ {description &&
+
+ {formatMessage(description)}
+
+ }
+
+
+ >
+ );
+};
-```
-yarn build
+Wysiwyg.defaultProps = {
+ description: '',
+ disabled: false,
+ error: undefined,
+ intlLabel: '',
+ required: false,
+ value: '',
+};
+
+Wysiwyg.propTypes = {
+ description: PropTypes.shape({
+ id: PropTypes.string,
+ defaultMessage: PropTypes.string,
+ }),
+ disabled: PropTypes.bool,
+ error: PropTypes.string,
+ intlLabel: PropTypes.shape({
+ id: PropTypes.string,
+ defaultMessage: PropTypes.string,
+ }),
+ name: PropTypes.string.isRequired,
+ onChange: PropTypes.func.isRequired,
+ required: PropTypes.bool,
+ value: PropTypes.string,
+};
+
+export default Wysiwyg;
```
:::
-::: tab npm
+## Registering the field
-```
-npm run build
-```
+The last step is to register the `wysiwyg` field with the `Wysiwyg` component using `addFields()`. Replace the content of the `admin/src/index.js` field of the plugin with the following code:
-:::
+```js
+// path: ./src/plugins/wysiwyg/admin/src/index.js
-::: tab strapi
+import pluginPkg from "../../package.json";
+import Wysiwyg from "./components/Wysiwyg";
+import pluginId from "./pluginId";
-```
-strapi build
-```
+const name = pluginPkg.strapi.name;
-:::
+export default {
+ register(app) {
+ app.addFields({ type: 'wysiwyg', Component: Wysiwyg });
-::::
+ app.registerPlugin({
+ id: pluginId,
+ isReady: true,
+ name,
+ });
+ },
+ bootstrap() {},
+};
+```
-::: tip
-If the plugin still doesn't show up, you should probably empty the `.cache` folder too.
-:::
+And _voilà_, if you [create a new collection type or single type](/user-docs/latest/content-types-builder/creating-new-content-type.md) with a [rich text field](/user-docs/latest/content-types-builder/configuring-fields-content-type.md#rich-text) you will see the implementation of [CKEditor](https://ckeditor.com/ckeditor-5/) instead of the default WYSIWYG:
-And VOILA, if you create a new `collectionType` or a `singleType` with a `richtext` field you will see the implementation of [CKEditor](https://ckeditor.com/ckeditor-5/) instead of the default WYSIWYG.
+
diff --git a/docs/developer-docs/latest/guides/scheduled-publication.md b/docs/developer-docs/latest/guides/scheduled-publication.md
index 8bc9121b6f..5676d3f2f2 100644
--- a/docs/developer-docs/latest/guides/scheduled-publication.md
+++ b/docs/developer-docs/latest/guides/scheduled-publication.md
@@ -18,7 +18,7 @@ What we want here is to be able to set a publication date for an article, and at
For this example, we will have to add a `publish_at` attribute to the **Article** Content Type.
-- Click on the Content-Type Builder link in the left menu
+- Click on the Content-type Builder link in the left menu
- Select the **Article** Content Type
- Add another field
- `date` attribute named `publish_at` with `datetime` type
diff --git a/docs/developer-docs/latest/guides/send-email.md b/docs/developer-docs/latest/guides/send-email.md
index ead096936b..cd5a881e3c 100644
--- a/docs/developer-docs/latest/guides/send-email.md
+++ b/docs/developer-docs/latest/guides/send-email.md
@@ -18,9 +18,9 @@ What we want here is to add some custom logic and call the email service when a
To be able to do that, you have first to understand some concepts.
-When you create a content type, it generates an API with the following list of [endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints).
+When you create a content-type, it generates an API with the following list of [endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints).
-Each of these endpoint triggers a controller action. Here is the list of [controller actions](/developer-docs/latest/development/backend-customization/controllers.md) that exist by default when a content type is created.
+Each of these endpoint triggers a controller action. Here is the list of [controller actions](/developer-docs/latest/development/backend-customization/controllers.md) that exist by default when a content-type is created.
If you check the controller file of your generated API `./api/{content-type}/controller/{Content-Type}.js`, you will see an empty file. It is because all the default logic is managed by Strapi. But you can override these actions with your own code.
@@ -28,11 +28,11 @@ And that is what we will do to add our custom code.
## Example
-To keep the code example easy to follow, we will just have a `Comment` content type and omit the `Author` and `Article` relations.
+To keep the code example easy to follow, we will just have a `Comment` content-type and omit the `Author` and `Article` relations.
-So lets create a `Comment` content type with just one **Text** field named `content`.
+So lets create a `Comment` content-type with just one **Text** field named `content`.
-When the content type is created, allow the create function for the Public role.
+When the content-type is created, allow the create function for the Public role.
To check if bad words are in the comment we will use `bad-words` [node module](https://www.npmjs.com/package/bad-words). You will have to install it in your application.
diff --git a/docs/developer-docs/latest/guides/slug.md b/docs/developer-docs/latest/guides/slug.md
index 3e9aa55249..c7d898493d 100644
--- a/docs/developer-docs/latest/guides/slug.md
+++ b/docs/developer-docs/latest/guides/slug.md
@@ -59,7 +59,7 @@ Here we will be able to setup the `slug` field.
For that you will have to install `slugify` node module in your application.
-When it's done, you have to update the life cycle of the **Article** Content Type to auto complete the `slug` field.
+When it's done, you have to update the lifecycle of the **Article** Content Type to auto complete the `slug` field.
**Path —** `./api/article/models/Article.js`
diff --git a/docs/developer-docs/latest/plugins/email.md b/docs/developer-docs/latest/plugins/email.md
index 4238b8a71b..9885fe6347 100644
--- a/docs/developer-docs/latest/plugins/email.md
+++ b/docs/developer-docs/latest/plugins/email.md
@@ -100,8 +100,8 @@ yarn add @strapi/provider-email-sendgrid --save
After installing your provider you will need to add some settings in `./config/plugins.js`. If this file doesn't exists, you'll need to create it. Check the README of each provider to know what configuration settings the provider needs.
-::: tip
-Make sure you have the correct spelling of the configuration filename, it is written in plural (with a trailing 's'): `plugins.js`.
+::: note
+When using community providers, pass the full package name to the `provider` key (e.g. `provider: 'strapi-provider-email-mandrill'`). Only Strapi-maintained providers can use the shortcode format (e.g. `provider: 'sendmail'`).
:::
Here is an example of a configuration made for the provider [@strapi/provider-email-sendgrid](https://www.npmjs.com/package/@strapi/provider-email-sendgrid).
@@ -155,17 +155,6 @@ module.exports = {
};
```
-It is important that your provider's `package.json` includes the following object:
-
-```json
-{
- // ...
- "strapi": {
- "isProvider": true
- }
-}
-```
-
In the `send` function you will have access to:
- `providerOptions` that contains configurations written in `plugins.js`
diff --git a/docs/developer-docs/latest/plugins/graphql.md b/docs/developer-docs/latest/plugins/graphql.md
index 4c0b44526b..5e36e079e1 100644
--- a/docs/developer-docs/latest/plugins/graphql.md
+++ b/docs/developer-docs/latest/plugins/graphql.md
@@ -7,7 +7,7 @@ canonicalUrl: https://docs.strapi.io/developer-docs/latest/plugins/graphql.html
# GraphQL
-By default Strapi create [REST endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints) for each of your content types. With the GraphQL plugin, you will be able to add a GraphQL endpoint to fetch and mutate your content.
+By default Strapi create [REST endpoints](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-endpoints) for each of your content-types. With the GraphQL plugin, you will be able to add a GraphQL endpoint to fetch and mutate your content.
:::strapi Looking for the GraphQL API documentation?
The [GraphQL API reference](/developer-docs/latest/developer-resources/database-apis-reference/graphql-api.md) describes queries, mutations and parameters you can use to interact with your API using Strapi's GraphQL plugin.
@@ -489,7 +489,7 @@ module.exports = {
The `middlewares` key is an array accepting a list of middlewares, each item in this list being either a reference to an already registered policy or an implementation that is passed directly (see [middlewares configuration documentation](/developer-docs/latest/development/backend-customization/routes.md#middlewares)).
-Middlewares directly implemented in `resolversConfig` can take the GraphQL resolver's `parent`, `args`, `context` and `info` objects as arguments.
+Middlewares directly implemented in `resolversConfig` can take the GraphQL resolver's [`parent`, `args`, `context` and `info` objects](https://www.apollographql.com/docs/apollo-server/data/resolvers/#resolver-arguments) as arguments.
:::tip
Middlewares with GraphQL can even act on nested resolvers, which offer a more granular control than with REST.
@@ -513,14 +513,26 @@ module.exports = {
* Basic middleware example #1
* Log resolving time in console
*/
- async (next, parent, args, context, info ) => {
- console.time('Start resolving categories');
- console.timeEnd('Stop resolving categories');
+ async (next, parent, args, context, info) => {
+ console.time('Resolving categories');
+
+ // call the next resolver
+ const res = await next(parent, args, context, info);
+
+ console.timeEnd('Resolving categories');
return res;
},
/**
* Basic middleware example #2
+ * Enable server-side shared caching
+ */
+ async (next, parent, args, context, info) => {
+ info.cacheControl.setCacheHint({ maxAge: 60, scope: "PUBLIC" });
+ return next(parent, args, context, info);
+ },
+ /**
+ * Basic middleware example #3
* change the 'name' attribute of parent with id 1 to 'foobar'
*/
(resolve, parent, ...rest) => {
diff --git a/docs/developer-docs/latest/plugins/i18n.md b/docs/developer-docs/latest/plugins/i18n.md
index 69913db1dc..859c8fd06f 100644
--- a/docs/developer-docs/latest/plugins/i18n.md
+++ b/docs/developer-docs/latest/plugins/i18n.md
@@ -53,9 +53,9 @@ The i18n plugin adds new features to the [REST API](/developer-docs/latest/devel
- a new [`locale`](#getting-localized-entries-with-the-locale-parameter) parameter to fetch content only for a specified locale
- the ability to create a localized entry, either [from scratch](#creating-a-new-localized-entry) or [for an existing localized entry](#creating-a-localization-for-an-existing-entry)
-### Getting localized entries with the `_locale` parameter
+### Getting localized entries with the `locale` parameter
-The `_locale` [API parameter](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-parameters) can be used to fetch entries only for a specified locale. It takes a locale code as value (see [full list of available locales](https://github.com/strapi/strapi/blob/master/packages/plugins/i18n/server/constants/iso-locales.json)).
+The `locale` [API parameter](/developer-docs/latest/developer-resources/database-apis-reference/rest-api.md#api-parameters) can be used to fetch entries only for a specified locale. It takes a locale code as value (see [full list of available locales](https://github.com/strapi/strapi/blob/v4.0.0/packages/plugins/i18n/server/constants/iso-locales.json)).
:::tip
To fetch content for a locale, make sure it has been already [added to Strapi in the admin panel](/user-docs/latest/settings/managing-global-settings.md#configuring-internationalization-locales).
@@ -64,12 +64,12 @@ To fetch content for a locale, make sure it has been already [added to Strapi in
The format for a GET request is the following:
:::request
-`GET /api/{content-type}?_locale={locale-code}`
+`GET /api/{content-type}?locale={locale-code}`
:::
-Use `all` as a value for the locale code, as in `http://localhost:1337/api/restaurants?_locale=all`, to fetch entries for all locales that have been configured in the admin panel.
+Use `all` as a value for the locale code, as in `http://localhost:1337/api/restaurants?locale=all`, to fetch entries for all locales that have been configured in the admin panel.
-If the `_locale` parameter isn't defined, it will be set to the default locale. `en` is the default locale when the i18n plugin is installed, so by default a GET request to `http://localhost:1337/api/restaurants` will return the same response as a request to `http://localhost:1337/api/restaurants?_locale=en`.
+If the `locale` parameter isn't defined, it will be set to the default locale. `en` is the default locale when the i18n plugin is installed, so by default a GET request to `http://localhost:1337/api/restaurants` will return the same response as a request to `http://localhost:1337/api/restaurants?locale=en`.
::: tip
Another locale can be [set as the default locale](/user-docs/latest/settings/managing-global-settings.md#adding-a-new-locale) in the admin panel.
@@ -85,7 +85,7 @@ When the i18n plugin is installed, the response to requests can include fields t
::: request Example request
-`GET http://localhost:1337/api/restaurants?_locale=fr`
+`GET http://localhost:1337/api/restaurants?locale=fr`
:::
@@ -700,6 +700,6 @@ The response returns the entry that has just been deleted.
## Configuration in production environments
-A `STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE` [environment variable](/developer-docs/latest/setup-deployment-guides/configurations/optional/environment.md#strapi-s-environment-variables) can be configured to set the initialization locale for your environment. The value used for this variable should be a string (see [full list of available locales](https://github.com/strapi/strapi/blob/releases/v4/packages/plugins/i18n/server/constants/iso-locales.json)).
+A `STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE` [environment variable](/developer-docs/latest/setup-deployment-guides/configurations/optional/environment.md#strapi-s-environment-variables) can be configured to set the initialization locale for your environment. The value used for this variable should be a string (see [full list of available locales](https://github.com/strapi/strapi/blob/v4.0.0/packages/plugins/i18n/server/constants/iso-locales.json)).
-This is useful when a Strapi app is deployed in production, with the i18n plugin installed and enabled on your content types for the first time. On a fresh i18n plugin installation, `en` is the default locale. So if the database does not contain any locale, and no `STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE` is set for the environment, the content of the content types with i18n enabled will be automatically migrated to the `en` locale. But if the `STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE` is defined, then the content will be migrated to this locale. Using this environment variable saves you from having to manually update the locale for existing content entries.
+This is useful when a Strapi app is deployed in production, with the i18n plugin installed and enabled on your content-types for the first time. On a fresh i18n plugin installation, `en` is the default locale. So if the database does not contain any locale, and no `STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE` is set for the environment, the content of the content-types with i18n enabled will be automatically migrated to the `en` locale. But if the `STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE` is defined, then the content will be migrated to this locale. Using this environment variable saves you from having to manually update the locale for existing content entries.
diff --git a/docs/developer-docs/latest/plugins/upload.md b/docs/developer-docs/latest/plugins/upload.md
index 7f6e7b4509..d12990bd94 100644
--- a/docs/developer-docs/latest/plugins/upload.md
+++ b/docs/developer-docs/latest/plugins/upload.md
@@ -406,8 +406,8 @@ module.exports = ({ env })=>({
To enable the provider, create or edit the file at `./config/plugins.js`
-:::tip
-When using community providers, you need to pass the full package name to the `provider` key, only Strapi maintained providers can use the short-code eg: `provider: 'strapi-provider-upload-google-cloud-storage'`
+::: note
+When using community providers, pass the full package name to the `provider` key (e.g. `provider: 'strapi-provider-upload-google-cloud-storage'`). Only Strapi-maintained providers can use the shortcode format (e.g. `provider: 'aws-s3'`).
:::
```js
diff --git a/docs/developer-docs/latest/plugins/users-permissions.md b/docs/developer-docs/latest/plugins/users-permissions.md
index 3c5827223a..bef07d5967 100644
--- a/docs/developer-docs/latest/plugins/users-permissions.md
+++ b/docs/developer-docs/latest/plugins/users-permissions.md
@@ -79,22 +79,30 @@ axios
### JWT configuration
-You can configure option for the JWT generation by creating `extensions/users-permissions/config/security.json` file.
+You can configure the JWT generation by using the [plugins configuration file](/developer-docs/latest/setup-deployment-guides/configurations/optional/plugins.md).
We are using [jsonwebtoken](https://www.npmjs.com/package/jsonwebtoken) to generate the JWT.
Available options:
-- `expiresIn`: expressed in seconds or a string describing a time span zeit/ms.
+- `jwtSecret`: random string used to create new JWTs, typically set using the `JWT_SECRET` [environment variable](/developer-docs/latest/setup-deployment-guides/configurations/optional/environment.md#strapi-s-environment-variables).
+- `jwt.expiresIn`: expressed in seconds or a string describing a time span zeit/ms.
Eg: 60, "45m", "10h", "2 days", "7d", "2y". A numeric value is interpreted as a seconds count. If you use a string be sure you provide the time units (minutes, hours, days, years, etc), otherwise milliseconds unit is used by default ("120" is equal to "120ms").
-**Path —** `extensions/users-permissions/config/security.json`
-```json
-{
- "jwt": {
- "expiresIn": "1d"
- }
-}
+```js
+// path: ./config/plugins.js
+
+module.exports = ({ env }) => ({
+ // ...
+ 'users-permissions': {
+ config: {
+ jwt: {
+ expiresIn: '7d',
+ },
+ },
+ },
+ // ...
+});
```
:::warning
@@ -436,7 +444,7 @@ The use of `ngrok` is not needed.
#### Using ngrok
-Discord accepts the `localhost` urls.
+Twitch accepts the `localhost` urls.
The use of `ngrok` is not needed.
#### Twitch configuration
@@ -944,8 +952,8 @@ For our discord provider it will look like:
discord: {
enabled: false, // make this provider disabled by default
icon: 'comments', // The icon to use on the UI
- key: '', // our provider app id (leave it blank, you will fill it with the content manager)
- secret: '', // our provider secret key (leave it blank, you will fill it with the content manager)
+ key: '', // our provider app id (leave it blank, you will fill it with the Content Manager)
+ secret: '', // our provider secret key (leave it blank, you will fill it with the Content Manager)
callback: '/auth/discord/callback', // the callback endpoint of our provider
scope: [ // the scope that we need from our user to retrieve information
'identify',
diff --git a/docs/developer-docs/latest/setup-deployment-guides/configurations/optional/functions.md b/docs/developer-docs/latest/setup-deployment-guides/configurations/optional/functions.md
index 0969a68f24..def1414e80 100644
--- a/docs/developer-docs/latest/setup-deployment-guides/configurations/optional/functions.md
+++ b/docs/developer-docs/latest/setup-deployment-guides/configurations/optional/functions.md
@@ -1,6 +1,6 @@
---
title: Functions - Strapi Developer Docs
-description: Strapi includes life cycle functions (e.g. register, bootstrap and destroy) that control the flow of your application.
+description: Strapi includes lifecycle functions (e.g. register, bootstrap and destroy) that control the flow of your application.
canonicalUrl: https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/configurations/optional/functions.html
---
diff --git a/docs/developer-docs/latest/setup-deployment-guides/configurations/optional/plugins.md b/docs/developer-docs/latest/setup-deployment-guides/configurations/optional/plugins.md
index 2a4c9ed308..9557ba2173 100644
--- a/docs/developer-docs/latest/setup-deployment-guides/configurations/optional/plugins.md
+++ b/docs/developer-docs/latest/setup-deployment-guides/configurations/optional/plugins.md
@@ -6,7 +6,7 @@ canonicalUrl: https://docs.strapi.io/developer-docs/latest/setup-deployment-guid
# Plugins configuration
-The configurations for all plugins are stored in `/config/plugins.js` (see [project structure](/developer-docs/latest/setup-deployment-guides/file-structure.md)). Each plugin can be configured with the following available parameters:
+The configurations for all plugins are stored in `./config/plugins.js` (see [project structure](/developer-docs/latest/setup-deployment-guides/file-structure.md)). Each plugin can be configured with the following available parameters:
| Parameter | Description | Type |
| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
diff --git a/docs/developer-docs/latest/setup-deployment-guides/configurations/required/admin-panel.md b/docs/developer-docs/latest/setup-deployment-guides/configurations/required/admin-panel.md
index 441ca07fd4..99e38a5405 100644
--- a/docs/developer-docs/latest/setup-deployment-guides/configurations/required/admin-panel.md
+++ b/docs/developer-docs/latest/setup-deployment-guides/configurations/required/admin-panel.md
@@ -10,26 +10,28 @@ The `./config/admin.js` is used to define admin panel configuration for the Stra
## Available options
- The `./config/admin.js` file can include the following parameters:
-
-| Parameter | Description | Type | Default |
-| --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------- |
-| `apiToken.salt` | Salt used to generate [API tokens](/developer-docs/latest/setup-deployment-guides/configurations/optional/api-tokens.md) | String | (A random string generated by Strapi) |
-| `auth` | Authentication configuration | Object | - |
-| `auth.secret` | Secret used to encode JWT tokens | string | `undefined` |
-| `auth.events` | Record of all the events subscribers registered for the authentication | object | `{}` |
-| `auth.events.onConnectionSuccess` | Function called when an admin user log in successfully to the administration panel | function | `undefined` |
-| `auth.events.onConnectionError` | Function called when an admin user fails to log in to the administration panel | function | `undefined` |
-| `url` | Url of your admin panel. Default value: `/admin`. Note: If the url is relative, it will be concatenated with `url`. | string | `/admin` |
-| `autoOpen` | Enable or disabled administration opening on start. | boolean | `true` |
-| `watchIgnoreFiles` | Add custom files that should not be watched during development. See more [here](https://github.com/paulmillr/chokidar#path-filtering) (property `ignored`). | Array(string) | `[]` |
-| `host` | Use a different host for the admin panel. Only used along with `strapi develop --watch-admin` | string | `localhost` |
-| `port` | Use a different port for the admin panel. Only used along with `strapi develop --watch-admin` | string | `8000` |
-| `serveAdminPanel` | If false, the admin panel won't be served. Note: the `index.html` will still be served, see [defaultIndex option](/developer-docs/latest/setup-deployment-guides/configurations/required/middlewares.md) | boolean | `true` |
-| `forgotPassword` | Settings to customize the forgot password email (see more here: [Forgot Password Email](/developer-docs/latest/development/admin-customization.md#forgotten-password-email)) | Object | {} |
-| `forgotPassword.emailTemplate` | Email template as defined in [email plugin](/developer-docs/latest/plugins/email.md#programmatic-usage) | Object | [Default template](https://github.com/strapi/strapi/tree/master/packages/strapi-admin/config/email-templates/forgot-password.js) |
-| `forgotPassword.from` | Sender mail address | string | Default value defined in your [provider configuration](/developer-docs/latest/plugins/email.md#configure-the-plugin) |
-| `forgotPassword.replyTo` | Default address or addresses the receiver is asked to reply to | string | Default value defined in your [provider configuration](/developer-docs/latest/plugins/email.md#configure-the-plugin) |
+The `./config/admin.js` file can include the following parameters:
+
+| Parameter | Description | Type | Default |
+| --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------- |
+| `apiToken.salt` | Salt used to generate [API tokens](/developer-docs/latest/setup-deployment-guides/configurations/optional/api-tokens.md) | string | Random string |
+| `auth` | Authentication configuration | object | - |
+| `auth.secret` | Secret used to encode JWT tokens | string | `undefined` |
+| `auth.options` | Options object passed to [jsonwebtoken](https://www.npmjs.com/package/jsonwebtoken) | object | - |
+| `auth.options.expiresIn` | JWT expire time used in [jsonwebtoken](https://www.npmjs.com/package/jsonwebtoken) | object | `30d` |
+| `auth.events` | Record of all the events subscribers registered for the authentication | object | `{}` |
+| `auth.events.onConnectionSuccess` | Function called when an admin user log in successfully to the administration panel | function | `undefined` |
+| `auth.events.onConnectionError` | Function called when an admin user fails to log in to the administration panel | function | `undefined` |
+| `url` | Url of your admin panel. Default value: `/admin`. Note: If the url is relative, it will be concatenated with `url`. | string | `/admin` |
+| `autoOpen` | Enable or disabled administration opening on start. | boolean | `true` |
+| `watchIgnoreFiles` | Add custom files that should not be watched during development. See more [here](https://github.com/paulmillr/chokidar#path-filtering) (property `ignored`). | array(string) | `[]` |
+| `host` | Use a different host for the admin panel. Only used along with `strapi develop --watch-admin` | string | `localhost` |
+| `port` | Use a different port for the admin panel. Only used along with `strapi develop --watch-admin` | string | `8000` |
+| `serveAdminPanel` | If false, the admin panel won't be served. Note: the `index.html` will still be served, see [defaultIndex option](/developer-docs/latest/setup-deployment-guides/configurations/required/middlewares.md) | boolean | `true` |
+| `forgotPassword` | Settings to customize the forgot password email (see more here: [Forgot Password Email](/developer-docs/latest/development/admin-customization.md#forgotten-password-email)) | object | {} |
+| `forgotPassword.emailTemplate` | Email template as defined in [email plugin](/developer-docs/latest/plugins/email.md#programmatic-usage) | object | [Default template](https://github.com/strapi/strapi/tree/master/packages/strapi-admin/config/email-templates/forgot-password.js) |
+| `forgotPassword.from` | Sender mail address | string | Default value defined in your [provider configuration](/developer-docs/latest/plugins/email.md#configure-the-plugin) |
+| `forgotPassword.replyTo` | Default address or addresses the receiver is asked to reply to | string | Default value defined in your [provider configuration](/developer-docs/latest/plugins/email.md#configure-the-plugin) |
## Configurations
@@ -54,8 +56,7 @@ module.exports = ({ env }) => ({
auth: {
secret: env('ADMIN_JWT_SECRET', 'someSecretKey'),
},
-})
-
+});
```
:::
@@ -78,6 +79,9 @@ module.exports = ({ env }) => ({
console.error(e.error, e.provider);
},
},
+ options: {
+ expiresIn: "7d",
+ },
secret: env('ADMIN_JWT_SECRET', 'someSecretKey'),
},
url: env('PUBLIC_ADMIN_URL', '/dashboard'),
@@ -93,10 +97,8 @@ module.exports = ({ env }) => ({
from: 'no-reply@example.com',
replyTo: 'no-reply@example.com',
},
-})
-
+});
```
:::
::::
-
diff --git a/docs/developer-docs/latest/setup-deployment-guides/configurations/required/middlewares.md b/docs/developer-docs/latest/setup-deployment-guides/configurations/required/middlewares.md
index ea0da7e353..4e0a8dc4d2 100644
--- a/docs/developer-docs/latest/setup-deployment-guides/configurations/required/middlewares.md
+++ b/docs/developer-docs/latest/setup-deployment-guides/configurations/required/middlewares.md
@@ -133,7 +133,7 @@ This security middleware is about cross-origin resource sharing (CORS) and is ba
### `errors`
-The errors middleware handles [errors](/developer-docs/latest/developer-resources/error-handling.md) thrown by the code. Based on the type of error it sets the appropriate HTTP status to the response. By default, any error not supposed to be exposed to the end-user will result in a 500 HTTP response.
+The errors middleware handles [errors](/developer-docs/latest/developer-resources/error-handling.md) thrown by the code. Based on the type of error it sets the appropriate HTTP status to the response. By default, any error not supposed to be exposed to the end user will result in a 500 HTTP response.
The middleware doesn't have any configuration option.
diff --git a/docs/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/amazon-aws.md b/docs/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/amazon-aws.md
index cfefa06b67..a4df43a7cc 100644
--- a/docs/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/amazon-aws.md
+++ b/docs/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/amazon-aws.md
@@ -603,6 +603,12 @@ http
- Port Range: `8080`
- Source: `Custom` `0.0.0.0/0, ::/0`
- Then `Save`
+ - If the `ufw` firewall is enabled, configure settings to include `port 8080` by running the following command:
+
+```bash
+sudo ufw allow 8080/tcp
+```
+
Earlier you setup `pm2` to start the services (your **Strapi project**) whenever the **EC2 instance** reboots or is started. You will now do the same for the `webhook` script.
diff --git a/docs/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/google-app-engine.md b/docs/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/google-app-engine.md
index 53924d2b63..199bcf4a75 100644
--- a/docs/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/google-app-engine.md
+++ b/docs/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/google-app-engine.md
@@ -37,7 +37,7 @@ When the setup completes, register an admin user using the form which opens in t
The `sqlite` database is created at `.tmp/data.db`.
-Login, but don't add content types yet. Close the browser. Quit the running app.
+Login, but don't add content-types yet. Close the browser. Quit the running app.
### Initial commit
@@ -93,8 +93,6 @@ Create another database, named `strapi` for example. It may be useful to delete
Create the `app.yaml` file in the project root.
-Add `app.yaml` to `.gitignore`.
-
The instance identifier looks like `myapi-123456:europe-west1:myapi`.
The `myapi-123456` part is the project identifier. (The number is automatically added to short project names).
@@ -106,7 +104,7 @@ The following is an example config for `Standard Environment` or `Flexible Envir
::: tab Standard Environment
```yaml
-runtime: nodejs14
+runtime: nodejs16
instance_class: F2
@@ -114,7 +112,7 @@ env_variables:
HOST: '0.0.0.0'
NODE_ENV: 'production'
DATABASE_NAME: 'strapi'
- DATABASE_USERNAME: 'postgres'
+ DATABASE_USER: 'postgres'
DATABASE_PASSWORD: ''
INSTANCE_CONNECTION_NAME: ''
@@ -135,7 +133,7 @@ env_variables:
HOST: '0.0.0.0'
NODE_ENV: 'production'
DATABASE_NAME: 'strapi'
- DATABASE_USERNAME: 'postgres'
+ DATABASE_USER: 'postgres'
DATABASE_PASSWORD: ''
INSTANCE_CONNECTION_NAME: ''
@@ -150,18 +148,25 @@ beta_settings:
Create `.gcloudignore` in the project root.
```
-app.yaml
.gcloudignore
.git
.gitignore
node_modules/
#!include:.gitignore
+!.env
```
In the case of Strapi, the admin UI will have to be re-built after every deploy,
and so we don't deploy local build artifacts, cache files and so on by including
the `.gitignore` entries.
+### Adding `.gitkeep` to database folder
+Google App Engine does not give `mkdir` permissions and the `database/migrations` folder is required for deployments. Make sure `git` keeps track of the `database/migrations` folder by adding a `.gitkeep` file to the folder. Use the following command:
+
+```bash
+touch .gitkeep
+```
+
### Configure the database
The `PostgreSQL` database will need the `pg` package.
@@ -170,26 +175,19 @@ The `PostgreSQL` database will need the `pg` package.
yarn add pg
```
-[Google App Engine requires](https://cloud.google.com/sql/docs/postgres/connect-app-engine) to connect to the database using the unix socket path, not an IP and port.
-
-Edit `database.js`, and use the socket path as `socketPath`.
-
-`Path: ./config/env/production/database.js`.
+Adding the production database configuration for connect to GCP SQL.
```js
+// path: ./config/env/production/database.js
+
module.exports = ({ env }) => ({
- defaultConnection: 'default',
- connections: {
- default: {
- connector: 'bookshelf',
- settings: {
- client: 'postgres',
- socketPath: `/cloudsql/${env('INSTANCE_CONNECTION_NAME')}`,
+ connection: {
+ client: 'postgres',
+ connection: {
+ host: `/cloudsql/${env('INSTANCE_CONNECTION_NAME')}`,
database: env('DATABASE_NAME'),
- username: env('DATABASE_USERNAME'),
+ user: env('DATABASE_USER'),
password: env('DATABASE_PASSWORD'),
- },
- options: {},
},
},
});
diff --git a/docs/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/heroku.md b/docs/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/heroku.md
index f38e17ec88..17c73b3ed3 100644
--- a/docs/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/heroku.md
+++ b/docs/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/heroku.md
@@ -6,18 +6,16 @@ canonicalUrl: https://docs.strapi.io/developer-docs/latest/setup-deployment-guid
# Heroku
-!!!include(developer-docs/latest/setup-deployment-guides/deployment/snippets/deployment-guide-not-updated.md)!!!
+This is a step-by-step guide for deploying a Strapi v3 or v4 project on [Heroku](https://www.heroku.com/). Databases that work well with Strapi and Heroku are discussed in the instructions on how to get started.
-This is a step-by-step guide for deploying a Strapi project on [Heroku](https://www.heroku.com/). Databases that work well with Strapi and Heroku are provided instructions on how to get started.
-
-### Heroku Install Requirements
+## Heroku Install Requirements
- You must have [Git installed and set-up locally](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup).
- You must have a [free Heroku account](https://signup.heroku.com/) before doing these steps.
-If you already have the Heroku CLI installed locally on your computer. Skip to [Login to Heroku](#_2-login-to-heroku-from-your-cli).
+If you already have the Heroku CLI installed locally on your computer, skip to [Login to Heroku](#_2-login-to-heroku-from-your-cli).
-#### 1. Heroku CLI Installation
+### 1. Heroku CLI Installation
Download and install the `Heroku CLI` for your operating system:
@@ -52,7 +50,7 @@ Download the appropriate installer for your Windows installation:
::::
-#### 2. Login to Heroku from your CLI
+### 2. Login to Heroku from your CLI
Next, you need to login to Heroku from your computer.
@@ -62,7 +60,7 @@ heroku login
Follow the instructions and return to your command line.
-#### 3. Create a new project (or use an existing one)
+### 3. Create a new project (or use an existing one)
Create a [new Strapi project](/developer-docs/latest/getting-started/quick-start.md) (if you want to deploy an existing project go to step 4).
@@ -85,10 +83,10 @@ yarn create strapi-app my-project --quickstart
::: tip
-When you use `--quickstart` to create a Strapi project locally, a **SQLite database** is used which is not compatible with Heroku. Therefore, another database option [must be chosen](#_7-heroku-database-set-up).
+When you use `--quickstart` to create a Strapi project locally, a **SQLite database** is used which is not compatible with Heroku. Therefore, another [database option](#_7-heroku-database-set-up) must be chosen.
:::
-#### 4. Update `.gitignore`
+### 4. Update `.gitignore`
Add the following line at end of `.gitignore`:
@@ -100,7 +98,7 @@ package-lock.json
Even if it is usually recommended to version this file, it may create issues on Heroku.
-#### 5. Init a Git repository and commit your project
+### 5. Init a Git repository and commit your project
Init the Git repository and commit your project.
@@ -113,7 +111,7 @@ git add .
git commit -m "Initial Commit"
```
-#### 6. Create a Heroku project
+### 6. Create a Heroku project
Create a new Heroku project.
@@ -138,19 +136,19 @@ heroku git:remote -a your-heroku-app-name
Your local development environment is now set-up and configured to work with Heroku. You have a new Strapi project and a new Heroku app ready to be configured to work with a database and with each other.
-#### 7. Heroku Database set-up
+### 7. Heroku Database set-up
-Below you will find database options when working with Heroku. Please choose the correct database (e.g. PostgreSQL) and follow those instructions.
+Below you will find database options, when working with Heroku. Please choose the correct database (e.g. PostgreSQL) and follow those instructions.
:::::: tabs card
::::: tab PostgreSQL
-### Heroku Postgres
+## Heroku Postgres
Follow these steps to deploy your Strapi app to Heroku using **PostgreSQL**:
-#### 1. Install the [Heroku Postgres addon](https://elements.heroku.com/addons/heroku-postgresql) for using Postgres.
+### 1. Install the [Heroku Postgres addon](https://elements.heroku.com/addons/heroku-postgresql) for using Postgres.
To make things even easier, Heroku provides a powerful addon system. In this section, you are going to use the Heroku Postgres addon, which provides a free "Hobby Dev" plan. If you plan to deploy your app in production, it is highly recommended switching to a paid plan.
@@ -160,7 +158,7 @@ To make things even easier, Heroku provides a powerful addon system. In this sec
heroku addons:create heroku-postgresql:hobby-dev
```
-#### 2. Retrieve database credentials
+### 2. Retrieve database credentials
The add-on automatically exposes the database credentials into a single environment variable accessible by your app. To retrieve it, type:
@@ -174,7 +172,7 @@ This should print something like this: `DATABASE_URL: postgres://ebitxebvixeeqd:
(This url is read like so: \*postgres:// **USERNAME** : **PASSWORD** @ **HOST** : **PORT** / **DATABASE_NAME\***)
-#### 3. Set Database variables automatically
+### 3. Set Database variables automatically
Strapi expects a variable for each database connection configuration (host, username, etc.). So, from the url above, Strapi will deconstruct that environment variable using [pg-connection-string](https://www.npmjs.com/package/pg-connection-string) package. Heroku will sometimes change the above url, so it's best to automate the deconstruction of it, as Heroku will automatically update the `DATABASE_URL` environment variable.
@@ -196,7 +194,7 @@ yarn add pg-connection-string
-#### 4. Create your Heroku database config file for production
+### 4. Create your Heroku database config file for production
Create new subfolders in `./config` like so: `/env/production`, then create a new `database.js` in it (see [environment documentation](/developer-docs/latest/setup-deployment-guides/configurations/optional/environment.md)). Your path should look like this: `./config/env/production/database.js`. When you run locally you should be using the `./config/database.js` which could be set to use SQLite, however it's recommended you use PostgreSQL locally also, for information on configuring your local database, please see the [database documentation](/developer-docs/latest/setup-deployment-guides/configurations/required/databases.md).
@@ -230,7 +228,7 @@ You also need to set the `NODE_ENV` variable on Heroku to `production` to ensure
heroku config:set NODE_ENV=production
```
-#### 5. Create your Strapi server config for production
+### 5. Create your Strapi server config for production
Create a new `server.js` in a new [env](/developer-docs/latest/setup-deployment-guides/configurations/optional/environment.md) folder. In this file you only need one key, the `url`, to notify Strapi what our public Heroku domain is. All other settings will automatically be pulled from the default `./config/server.js`.
@@ -248,7 +246,7 @@ You will also need to set the environment variable in Heroku for the `MY_HEROKU_
heroku config:set MY_HEROKU_URL=$(heroku info -s | grep web_url | cut -d= -f2)
```
-#### 6. Install the `pg` node module
+### 6. Install the `pg` node module
Unless you originally installed Strapi with PostgreSQL, you need to install the [pg](https://www.npmjs.com/package/pg) node module.
@@ -274,7 +272,7 @@ yarn add pg
::::::
-#### 8. Commit your changes
+### 8. Commit your changes
`Path: ./my-project/`
@@ -283,7 +281,7 @@ git add .
git commit -m "Update database config"
```
-#### 9. Update Yarn lockfile
+### 9. Update Yarn lockfile
`Path: ./my-project/`
@@ -291,7 +289,7 @@ git commit -m "Update database config"
yarn install
```
-#### 10. Commit your changes
+### 10. Commit your changes
`Path: ./my-project/`
@@ -300,7 +298,7 @@ git add yarn.lock
git commit -m "Updated Yarn lockfile"
```
-#### 11. Deploy
+### 11. Deploy
`Path: ./my-project/`
@@ -321,10 +319,10 @@ If you see the Strapi Welcome page, you have correctly set-up, configured and de
You can now continue with the [Quick Start Guide](/developer-docs/latest/getting-started/quick-start.md), if you have any questions on how to proceed.
::: caution
-For security reasons, the Content-Type Builder plugin is disabled in production. To update content structure, please make your changes locally and deploy again.
+For security reasons, the Content-type Builder plugin is disabled in production. To update content structure, please make your changes locally and deploy again.
:::
-### Project updates
+## Project updates
When Strapi is deployed to Heroku, Heroku sets the environment variable to `NODE_ENV=production`. In `production mode` Strapi disables the content-type builder (for security reasons). Additionally, if you wanted to change the default production mode in Heroku, it wouldn't work as the file system is temporary. Strapi writes files to the server when you update the content-types and these updates would disappear when Heroku restarts the server.
@@ -341,13 +339,13 @@ git push heroku HEAD:main
heroku open
```
-### File Uploads
+## File Uploads
-Like with project updates on Heroku, the file system doesn't support local uploading of files as they will be wiped when Heroku "Cycles" the dyno. This type of file system is called [ephemeral](https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem), which means the file system only lasts until the dyno is restarted (with Heroku this happens any time you redeploy or during their regular restart which can happen every few hours or every day).
+Like with project updates on Heroku, the file system doesn't support local uploading of files as they will be wiped when Heroku "cycles" the dyno. This type of file system is called [ephemeral](https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem), which means the file system only lasts until the dyno is restarted (with Heroku this happens any time you redeploy or during their regular restart which can happen every few hours or every day).
Due to Heroku's filesystem you will need to use an upload provider such as AWS S3, Cloudinary, or Rackspace. You can view the documentation for installing providers [here](/developer-docs/latest/plugins/upload.md#create-providers) and you can see a list of providers from both Strapi and the community on [npmjs.com](https://www.npmjs.com/search?q=strapi-provider-upload-&page=0&perPage=20).
-### Gzip
+## Gzip
As of version `3.2.1`, Strapi uses [`koa-compress`](https://github.com/koajs/compress) v5, which enables [Brotli](https://en.wikipedia.org/wiki/Brotli) compression by default. At the time of writing, the default configuration for Brotli results in poor performance, causing very slow response times and potentially response timeouts. If you plan on enabling the [gzip middleware](/developer-docs/latest/setup-deployment-guides/configurations/required/middlewares.md#internal-middlewares-configuration-reference), it is recommended that you disable Brotli or define better configuration params.
diff --git a/docs/developer-docs/latest/setup-deployment-guides/file-structure.md b/docs/developer-docs/latest/setup-deployment-guides/file-structure.md
index 3b4b0394c1..49e8fac501 100644
--- a/docs/developer-docs/latest/setup-deployment-guides/file-structure.md
+++ b/docs/developer-docs/latest/setup-deployment-guides/file-structure.md
@@ -60,7 +60,7 @@ The default structure of a Strapi project created without the starter CLI looks
│ │ └──── (api-name)
│ │ ├──── content-types
│ │ │ └──── (content-type-name)
-│ │ │ └ lifecyles.js
+│ │ │ └ lifecycles.js
│ │ │ └ schema.json
│ │ ├──── controllers
│ │ ├──── middlewares
@@ -88,8 +88,9 @@ The default structure of a Strapi project created without the starter CLI looks
│ │ │ └──── src
│ │ │ └ index.js
│ │ ├──── server
-│ │ ├──── controllers
-│ │ ├──── policies
+│ │ │ ├──── content-types
+│ │ │ ├──── controllers
+│ │ │ └──── policies
│ │ ├ package.json
│ │ ├ strapi-admin.js
│ │ └ strapi-server.js
diff --git a/docs/developer-docs/latest/setup-deployment-guides/installation/digitalocean-customization.md b/docs/developer-docs/latest/setup-deployment-guides/installation/digitalocean-customization.md
index 843d0a5cd7..1e71a82495 100644
--- a/docs/developer-docs/latest/setup-deployment-guides/installation/digitalocean-customization.md
+++ b/docs/developer-docs/latest/setup-deployment-guides/installation/digitalocean-customization.md
@@ -83,7 +83,7 @@ For security purposes, the DigitalOcean virtual machine hosting the Strapi appli
The service user home directory is located at `/srv/strapi`. The actual Strapi application is located within this home directory at `/srv/strapi/strapi-development`.
-The Strapi application runs in the `development` environment to allow for creating content types. It is not recommended to use it directly in production. For staging and production environments, it's recommended to configure a private git repository to commit changes into, and create a new application directory within the service user's home (e.g. `/srv/strapi/strapi-production`).
+The Strapi application runs in the `development` environment to allow for creating content-types. It is not recommended to use it directly in production. For staging and production environments, it's recommended to configure a private git repository to commit changes into, and create a new application directory within the service user's home (e.g. `/srv/strapi/strapi-production`).
To run the new `production` or `staging` environments you can refer to the [PM2 Documentation](https://pm2.keymetrics.io/docs/usage/quick-start/#managing-processes)
diff --git a/docs/developer-docs/latest/setup-deployment-guides/installation/render.md b/docs/developer-docs/latest/setup-deployment-guides/installation/render.md
index fa7d0f5824..cbed401ce0 100644
--- a/docs/developer-docs/latest/setup-deployment-guides/installation/render.md
+++ b/docs/developer-docs/latest/setup-deployment-guides/installation/render.md
@@ -36,7 +36,7 @@ When using Cloudinary, you will be prompted to enter your account credentials as
## Running Strapi
-Your Strapi application on Render will be running in production mode, with `NODE_ENV=production`. However, to add or edit content-types via the admin panel (see [Content-Type Builder](https://strapi.io/documentation/user-docs/latest/content-types-builder/introduction-to-content-types-builder.html) documentation), Strapi must be running locally in development mode.
+Your Strapi application on Render will be running in production mode, with `NODE_ENV=production`. However, to add or edit content-types via the admin panel (see [Content-type Builder](https://strapi.io/documentation/user-docs/latest/content-types-builder/introduction-to-content-types-builder.html) documentation), Strapi must be running locally in development mode.
To run Strapi locally:
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides.md b/docs/developer-docs/latest/update-migration-guides/migration-guides.md
index 5640dc0d76..1f21881ce1 100644
--- a/docs/developer-docs/latest/update-migration-guides/migration-guides.md
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides.md
@@ -2,6 +2,7 @@
title: Migrate Guides - Strapi Developer Docs
description: All the migration guides for a Strapi application.
canonicalUrl: https://docs.strapi.io/developer-docs/latest/update-migration-guides/migration-guides.html
+sidebarDepth: 0
---
# Migrations guides
@@ -26,11 +27,18 @@ If you were to upgrade your version from `3.2.3` to `3.6.1`, you would have to f
4. Migration guide from 3.4.x to 3.4.4.
5. [Update Strapi guide.](update-version.md)
-## v4-Stable guides
+## v4 stable guides
-At the moment there are no migration guides from v3-Stable to v4-Stable. These will be coming soon!
+::: callout 🚧 Upcoming migration guides
+This section is still a work in progress and will be continue to be updated and improved. The code and data migration guides will be released in March 2022. In the meantime, feel free to ask for help on the [forum](https://forum.strapi.io/) or on the community [Discord](https://discord.strapi.io).
+:::
+
+Migrating from v3.6.8 to v4.0.x revolves around 3 topics:
+- The [plugin migration guide](/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin-migration.md) helps migrating a plugin to v4.
+- The code migration guide _(coming soon!)_ helps migrating the built-in back-end and front-end code of the Strapi application to v4.
+- The data migration guide _(coming soon!)_ helps migrating the database content to v4.
-## V3-Stable guides
+## v3 stable guides
- [Migration guide from 3.4.x to 3.4.4](migration-guides/migration-guide-3.4.x-to-3.4.4.md)
- [Migration guide from 3.3.x to 3.4.0](migration-guides/migration-guide-3.3.x-to-3.4.0.md)
@@ -39,7 +47,7 @@ At the moment there are no migration guides from v3-Stable to v4-Stable. These w
- [Migration guide from 3.1.x to 3.2.3](migration-guides/migration-guide-3.1.x-to-3.2.x.md)
- [Migration guide from 3.0.x to 3.1.x](migration-guides/migration-guide-3.0.x-to-3.1.x.md)
-## v3-Beta guides
+## v3 beta guides
::: warning
@@ -56,7 +64,7 @@ If you have issues upgrading, it's our general recommendation to create a new pr
- [Migration guide from beta.16+ to beta.17.4](migration-guides/migration-guide-beta.16-to-beta.17.4.md)
- [Migration guide from beta.15 to beta.16](migration-guides/migration-guide-beta.15-to-beta.16.md)
-## v3-Alpha guides
+## v3 alpha guides
::: warning
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-3.1.x-to-3.2.x.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-3.1.x-to-3.2.x.md
index f638612903..53941a4746 100644
--- a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-3.1.x-to-3.2.x.md
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-3.1.x-to-3.2.x.md
@@ -28,8 +28,8 @@ Otherwise you can follow the basic [version update guide](/developer-docs/latest
**Draft & Publish**
-The new **Draft & Publish** feature will add a `published_at` field to your **content types** if you enable the feature.
-If you have been using this field name on your **content types** you will need to first rename or delete it before being able to use the feature on those **content types**.
+The new **Draft & Publish** feature will add a `published_at` field to your **content-types** if you enable the feature.
+If you have been using this field name on your **content-types** you will need to first rename or delete it before being able to use the feature on those **content-types**.
**Strapi-admin Translations**
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.12.2-to-alpha.12.3.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.12.2-to-alpha.12.3.md
index 123744ed5d..1552c041b0 100644
--- a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.12.2-to-alpha.12.3.md
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.12.2-to-alpha.12.3.md
@@ -10,7 +10,7 @@ canonicalUrl: https://docs.strapi.io/developer-docs/latest/update-migration-guid
- Framework tests suite
- Filters in the Content Manager plugin
-- One way relation in the Content-Type Builder
+- One way relation in the Content-type Builder
- GraphQL update: timestamp fields update and some bug fixes
- Fix delete manyToMany relations with Mongoose
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.12.3-to-alpha.12.4.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.12.3-to-alpha.12.4.md
index 599df7c198..04f6280f6a 100644
--- a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.12.3-to-alpha.12.4.md
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.12.3-to-alpha.12.4.md
@@ -8,9 +8,9 @@ canonicalUrl: https://docs.strapi.io/developer-docs/latest/update-migration-guid
**Here are the major changes:**
-- Add search to content manager
+- Add search to Content Manager
- Add bulk actions in content-manager
-- Add Enumeration type to Content-Type Builder
+- Add Enumeration type to Content-type Builder
**Useful links:**
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.12.7-to-alpha.13.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.12.7-to-alpha.13.md
index dafcc553ff..9bc8e2b769 100644
--- a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.12.7-to-alpha.13.md
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.12.7-to-alpha.13.md
@@ -9,7 +9,7 @@ canonicalUrl: https://docs.strapi.io/developer-docs/latest/update-migration-guid
**Here are the major changes:**
- Rename hook name
-- New settings for content manager plugin
+- New settings for Content Manager plugin
**Useful links:**
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.13.1-to-alpha.14.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.13.1-to-alpha.14.md
index 29758db8cd..d15a51cd97 100644
--- a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.13.1-to-alpha.14.md
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.13.1-to-alpha.14.md
@@ -8,7 +8,7 @@ canonicalUrl: https://docs.strapi.io/developer-docs/latest/update-migration-guid
**Here are the major changes:**
-- New configuration of the content manager
+- New configuration of the Content Manager
- GraphQL Aggregation Feature
- Email confirmation and block user feature
@@ -63,9 +63,9 @@ Then, delete your old `plugins` folder and replace it with the new one.
-## Reset your content manager settings
+## Reset your Content Manager settings
-We added a new section in the content manager configurations. You are now able to customize the inputs displayed in the contribution view.
+We added a new section in the Content Manager configurations. You are now able to customize the inputs displayed in the contribution view.
The stored data format has been changed. That is why you **will have** to **delete** in the `core_store` collection/table the entry with the `key` `plugin_content-manager_schema`.
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.14.5-to-alpha.15.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.14.5-to-alpha.15.md
index dbda3296ed..b85db94b39 100644
--- a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.14.5-to-alpha.15.md
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.14.5-to-alpha.15.md
@@ -67,7 +67,7 @@ Go in [diff files](https://github.com/strapi/strapi/compare/v3.0.0-alpha.14.5...
Services: `packages/strapi-generate-api/templates/bookshelf/service.template`
-Life cycle: `packages/strapi-generate-model/templates/bookshelf/model.template`
+lifecycle: `packages/strapi-generate-model/templates/bookshelf/model.template`
You will have to update all your service by applying the diff.
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.15-to-alpha.16.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.15-to-alpha.16.md
index 6ef3e69228..26c4eaf77e 100644
--- a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.15-to-alpha.16.md
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.15-to-alpha.16.md
@@ -66,7 +66,7 @@ Reverse of migration [alpha.14.5 to alpha.15](migration-guide-alpha.14.5-to-alph
Go in [diff files](https://github.com/strapi/strapi/compare/v3.0.0-alpha.15...v3.0.0-alpha.16) and search for following files:
Services: `packages/strapi-generate-api/templates/bookshelf/service.template`
-Life cycle: `packages/strapi-generate-model/templates/bookshelf/model.template`
+lifecycle: `packages/strapi-generate-model/templates/bookshelf/model.template`
You will have to update all your service by applying the diff.
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.24-to-alpha.25.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.24-to-alpha.25.md
index 3db05acc8f..4d78c1bb9b 100644
--- a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.24-to-alpha.25.md
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-alpha.24-to-alpha.25.md
@@ -68,7 +68,7 @@ Update all your API services by following this update [https://github.com/strapi
Update all your API services by following this update [https://github.com/strapi/strapi/pull/2970/files#diff-61ba361ed6161efcd5f4e583001cc9c9R240](https://github.com/strapi/strapi/pull/2970/files#diff-61ba361ed6161efcd5f4e583001cc9c9R240) and [https://github.com/strapi/strapi/pull/2864/files#diff-61ba361ed6161efcd5f4e583001cc9c9R124](https://github.com/strapi/strapi/pull/2864/files#diff-61ba361ed6161efcd5f4e583001cc9c9R124)
-We update the name of the life cycle for the before/after fetch all [https://github.com/strapi/strapi/pull/2965/files](https://github.com/strapi/strapi/pull/2965/files)
+We update the name of the lifecycle for the before/after fetch all [https://github.com/strapi/strapi/pull/2965/files](https://github.com/strapi/strapi/pull/2965/files)
You will have to replace `beforeFetchCollection` by `beforeFetchAll` if you added theses functions in you `Model.js` files.
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-beta.17-to-beta.18.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-beta.17-to-beta.18.md
index 8ea01bfdd9..08b0fd5ee5 100644
--- a/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-beta.17-to-beta.18.md
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/migration-guide-beta.17-to-beta.18.md
@@ -408,7 +408,7 @@ Some database changes have occured:
Make sure to run those queries for the tables that exist in your database.
-_`Queries for a Restaurant content type`_
+_`Queries for a Restaurant content-type`_
:::: tabs
::: tab Sqlite
@@ -541,7 +541,7 @@ WHERE related_type = 'groups_old_table_name';
#### Mongo
-In `mongo` the relation between a content type and its components is held in an array of references. To know which component type it referes to, the array also contains a `kind` attribute containing the component Schema name.
+In `mongo` the relation between a content-type and its components is held in an array of references. To know which component type it referes to, the array also contains a `kind` attribute containing the component Schema name.
**How to migrate**
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin-migration.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin-migration.md
new file mode 100644
index 0000000000..5b38295742
--- /dev/null
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin-migration.md
@@ -0,0 +1,34 @@
+---
+title: Plugin migration guide for v4 - Strapi Developer Docs
+description: Migrate a Strapi plugin from v3.6.8 to v4.0.x with step-by-step instructions
+sidebarDepth: 2
+canonicalUrl: https://docs.strapi.io/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin-migration.html
+---
+
+# v4 plugin migration guide
+
+The goal of this guide is to get a v3 plugin up and running on v4 by resolving breaking changes.
+
+:::note
+This guide is not an exhaustive resource for the v4 plugin APIs, which are described in the [Server API](/developer-docs/latest/developer-resources/plugin-api-reference/server.md#server-api-for-plugins) and [Admin Panel API](/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md#admin-panel-api-for-plugins) documentations.
+:::
+
+Migrating a plugin from Strapi v3.6.8 to v4.0.x consists in the following steps:
+
+- [updating the folder structure](/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/update-folder-structure.md),
+- optionally, [migrating the back-end code](/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-back-end.md) if the plugin interacts with Strapi's back end,
+- optionally, [migrating the front-end code](/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-front-end.md) if the plugin interacts with the admin panel,
+- and [enabling the plugin](/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/enable-plugin.md).
+
+Depending on these steps, some actions can only be done manually while others can be performed automatically by scripts that modify the code, which are called codemods. The following table lists available options for each step of the migration:
+
+| Action | Migration type |
+| ----------------------------------- | ---------------------------------------------------------------------------------------------------------- |
+| Update the folder structure | [Automatic](/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/update-folder-structure.md#updating-folder-structure-automatically) or [manual](/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/update-folder-structure.md#updating-folder-structure-manually) |
+| Migrate the back end of the plugin | [Partially automatic](/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-back-end.md) |
+| Migrate the front end of the plugin | [Manual](/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-front-end.md) |
+| Enable the plugin | [Manual](/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/enable-plugin.md) |
+
+::: strapi Codemods support & community contributions
+If you have any issues with the codemods or would like to contribute to the project please [create an issue](https://github.com/strapi/codemods/issues) or [open a pull request](https://github.com/strapi/codemods/pulls).
+:::
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/enable-plugin.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/enable-plugin.md
new file mode 100644
index 0000000000..6d1f23715f
--- /dev/null
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/enable-plugin.md
@@ -0,0 +1,55 @@
+---
+title: v4 plugin migration - Enabling a plugin - Strapi Developer Docs
+description: Enable a Strapi plugin while migrating from v3.6.8 to v4.0.x with step-by-step instructions
+canonicalUrl: http://docs.strapi.io/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/enable-plugin.html
+prev: /developer-docs/latest/update-migration-guides/migration-guides/v4/plugin-migration.md
+---
+
+# v4 plugin migration: Enabling a plugin
+
+!!!include(developer-docs/latest/update-migration-guides/migration-guides/v4/snippets/plugin-migration-intro.md)!!!
+
+::: strapi v3/v4 comparison
+A Strapi v3 plugin was enabled if it was manually installed or found in the `plugins` directory.
+
+In Strapi v4:
+
+- Installed plugins following the [automatic plugins discovery](/developer-docs/latest/plugins/plugins-intro.md#automatic-plugins-discovery) pattern will automatically be enabled.
+- While developing a local plugin, the plugin must explicitly be enabled in [the `./config/plugins.js` file](/developer-docs/latest/setup-deployment-guides/configurations/optional/plugins.md) of the Strapi application.
+:::
+
+To enable a local plugin in v4 and define an optional configuration:
+
+1. If it does not already exist, create the `./config/plugins.js` file.
+
+2. In the `./config/plugins.js` file, export a function that:
+ - returns an object
+ - and can take the `{ env }` object as a parameter (see [Environment configuration](/developer-docs/latest/setup-deployment-guides/configurations/optional/environment.md) documentation).
+
+3. Within the object exported by `./config/plugins.js`, create a key with the name of the plugin (e.g. `"my-plugin"`). The value of this key is also an object.
+
+4. Within the `"my-plugin"` object, set the `enabled` key value to `true` (boolean).
+
+5. _(optional)_ Add a `resolve` key, whose value is the path of the plugin folder (as a string), and a `config` key (as an object) that can include additional configuration for the plugin (see [plugins configuration](/developer-docs/latest/setup-deployment-guides/configurations/optional/plugins.md) documentation).
+
+::: details Example: Enabling and configuring a "my-plugin" plugin
+
+```js
+// path: ./config/plugins.js
+
+module.exports = ({ env }) => ({
+ "my-plugin": {
+ enabled: true,
+ resolve: "./path-to-my-plugin",
+ config: {
+ // additional configuration goes here
+ },
+ },
+});
+```
+
+:::
+
+:::note Plugins published on npm
+If the plugin will be published on npm, the `package.json` file should include a `strapi.kind` key with a value set to `"plugin"` (i.e. `{ "strapi": { "kind": "plugin" } }`).
+:::
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-back-end.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-back-end.md
new file mode 100644
index 0000000000..1c0964567a
--- /dev/null
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-back-end.md
@@ -0,0 +1,226 @@
+---
+title: v4 Plugin Migration - Migrating the back end - Strapi Developer Docs
+description: Migrate the backend of a Strapi plugin from v3.6.8 to v4.0.x with step-by-step instructions
+canonicalUrl: http://docs.strapi.io/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-back-end.html
+---
+
+# v4 plugin migration: Migrating the back end
+
+!!!include(developer-docs/latest/update-migration-guides/migration-guides/v4/snippets/plugin-migration-intro.md)!!!
+
+Migrating the back end of a plugin to Strapi v4 requires:
+
+- updating [imports](#updating-imports)
+- updating content-types [getters](#updating-content-types-getters) and, optionally, [relations](#updating-content-types-relations)
+- updating the [plugin configuration](#updating-plugin-configuration)
+
+Depending on these steps, some actions can only be done manually while others can be performed automatically by scripts that modify the code, which are called codemods. The following table lists available options for each step of the migration:
+
+| Action | Migration type |
+| ------------------------------ | ------------------------------------------------------------------------------------------------------------ |
+| Update imports | [Automatic](#automatic-imports-update) or [manual](#manual-imports-update) |
+| Update content-types getters | [Automatic](#automatic-content-types-getters-update) or [manual](#manual-content-types-getters-update) |
+| Update content-types relations | [Manual](#updating-content-types-relations) |
+| Update configuration | [Manual](#updating-plugin-configuration) |
+
+## Updating imports
+
+:::strapi v3/v4 comparison
+Package names in Strapi v3 are prefixed by `strapi-`.
+
+Strapi v4 uses scoped imports.
+:::
+
+To migrate to Strapi v4, update all Strapi imports from `strapi-package-name` to `@strapi/package-name`. Imports can be updated [automatically](#automatic-imports-update) or [manually](#manual-imports-update).
+
+### Automatic imports update
+
+::: caution
+Codemods modify the plugin source code. Before running a command, make sure you have initialized a git repo, the working tree is clean, you have pushed your v3 plugin, and you are on a new branch.
+:::
+
+To update imports automatically, use the [`update-strapi-scoped-imports` codemod](https://github.com/strapi/codemods/blob/main/lib/v4/transforms/update-strapi-scoped-imports.js) by running the following command in a terminal:
+
+ ```sh
+ npx @strapi/codemods transform update-strapi-scoped-imports [path-to-file | folder]
+ ```
+
+### Manual imports update
+
+To update all imports manually, find any imports of Strapi packages (e.g. `strapi-package-name`) and rename them to `@strapi/package-name`.
+
+## Updating content-types getters
+
+:::strapi v3/v4 comparison
+Strapi v3 models have been renamed to [content-types](/developer-docs/latest/development/backend-customization/models.md#content-types) in Strapi v4.
+:::
+
+If the plugin declares models, update the syntax for all getters from `strapi.models` to `strapi.contentTypes`. The syntax can be updated [automatically](#automatic-content-types-getters-update) or [manually](#manual-content-types-getters-update).
+
+### Automatic content-types getters update
+
+::: caution
+!!!include(developer-docs/latest/update-migration-guides/migration-guides/v4/snippets/codemod-modify-source-code.md)!!!
+:::
+
+To update the syntax for content-types getters automatically, use the [`change-model-getters-to-content-types` codemod](https://github.com/strapi/codemods/blob/main/lib/v4/transforms/change-model-getters-to-content-types.js). The codemod replaces all instances of `strapi.models` with `strapi.contentTypes` in the indicated file or folder.
+
+To use the codemod, run the following command in a terminal:
+
+```jsx
+npx @strapi/codemods transform change-model-getters-to-content-types [path-to-file | folder]
+```
+
+### Manual content-types getters update
+
+To update the syntax for content-types getters manually, replace any instance of `strapi.models` with `strapi.contentTypes`.
+
+:::tip
+Strapi v4 introduced new getters that can be used to refactor the plugin code further (see [Server API usage documentation](/developer-docs/latest/developer-resources/plugin-api-reference/server.md#usage)).
+:::
+
+## Updating content-types relations
+
+::: prerequisites
+Updating content-types relations to Strapi v4 requires that the v3 models have been converted to Strapi v4 content-types (see [converting models to content-types documentation](/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/update-folder-structure.md#converting-models-to-content-types)).
+:::
+
+::: strapi v3/v4 comparison
+Strapi v3 defines relations between content-types with the `via`, `model` and `collection` properties in the model settings.
+
+In Strapi v4, relations should be explicitly described in the `schema.json` file of the content-types (see [relations documentation](/developer-docs/latest/development/backend-customization/models.md#relations)).
+:::
+
+If the plugin declares content-types with relations between them, migrating relations to Strapi v4 should be done manually in the [schema](/developer-docs/latest/development/backend-customization/models.md#model-schema) of the content-types.
+
+To update content-type relations, update the `server/content-types//schema.json` file for each content-type with the following procedure:
+
+1. Declare the relation explicitly by setting the `type` attribute value to `"relation"`.
+
+2. Define the type of relation with the `relation` property. The value should be a string among the following possible options: `"oneToOne"`, `"oneToMany"`, `"manyToOne"` or `"manyToMany"`.
+
+3. Define the content-type target with the `target` property. The value should be a string following the `api::api-name.content-type-name` or `plugin::plugin-name.content-type-name` syntax convention.
+
+4. (_optional_) In [bidirectional relations](/developer-docs/latest/development/backend-customization/models.md#relations), define `mappedBy` and `inversedBy` properties on each content-type.
+
+::: details Example of all possible relations between an article and an author content-types
+
+ ```json
+ // path: ./src/plugins/my-plugin/server/content-types/article/schema.json
+
+ // Attributes for the Article content-type
+ "articleHasOneAuthor": {
+ "type": "relation",
+ "relation": "oneToOne",
+ "target": "api::author.author"
+ },
+ "articleHasAndBelongsToOneAuthor": {
+ "type": "relation",
+ "relation": "oneToOne",
+ "target": "api::author.author",
+ "inversedBy": "article"
+ },
+ "articleBelongsToManyAuthors": {
+ "type": "relation",
+ "relation": "oneToMany",
+ "target": "api::author.author",
+ "mappedBy": "article"
+ },
+ "authorHasManyArticles": {
+ "type": "relation",
+ "relation": "manyToOne",
+ "target": "api::author.author",
+ "inversedBy": "articles"
+ },
+ "articlesHasAndBelongsToManyAuthors": {
+ "type": "relation",
+ "relation": "manyToMany",
+ "target": "api::author.author",
+ "inversedBy": "articles"
+ },
+ "articleHasManyAuthors": {
+ "type": "relation",
+ "relation": "oneToMany",
+ "target": "api::author.author"
+ }
+ ```
+
+ ```json
+ // path: ./src/plugins/my-plugin/server/content-types/author/schema.json
+
+ // Attributes for the Author content-type
+ "article": {
+ "type": "relation",
+ "relation": "manyToOne",
+ "target": "api::article.article",
+ "inversedBy": "articleBelongsToManyAuthors"
+ },
+ "articles": {
+ "type": "relation",
+ "relation": "manyToMany",
+ "target": "api::article.article",
+ "inversedBy": "articlesHasAndBelongsToManyAuthors"
+ }
+ ```
+
+:::
+
+## Updating plugin configuration
+
+:::strapi v3/v4 comparison
+Strapi v3 defines plugin configurations in a `config` folder.
+
+In Strapi v4, the default configuration of a plugin is defined as an object found in the `config.js` file or in the `config/index.js` file. These are then called from the entry file (see [default plugin configuration documentation](/developer-docs/latest/developer-resources/plugin-api-reference/server.md#configuration)).
+:::
+
+To handle default plugin configurations in Strapi v4 the recommended way:
+
+1. Create the `server/config/index.js` file containing an exported object.
+
+2. Within the `config` object:
+ - Define a `default` key that takes an object to store the default configuration.
+ - (_optional_) Add a `validator` key, which is a function taking the `config` as an argument.
+
+ ::: details Example of a default plugin configuration
+
+ ```jsx
+ // path: ./src/plugins/my-plugin/server/config/index.js
+
+ module.exports = {
+ default: { optionA: true },
+ validator: (config) => {
+ if (typeof config.optionA !== 'boolean') {
+ throw new Error('optionA has to be a boolean');
+ }
+ },
+ }
+ ```
+
+ :::
+
+3. In the `server/index.js` file, import the configuration and export it.
+
+ ::: details Example of a default entry file
+
+ ```jsx
+ // path: ./src/plugins/my-plugin/server/index.js
+
+ // ...
+ const config = require('./config');
+ // ...
+
+ module.exports = {
+ // ...
+ config,
+ // ...
+ };
+ ```
+ :::
+
+4. Make sure that Strapi is aware of the plugin's back-end interface exported from `server/index.js` by adding the following line to the `/strapi-server.js` entry file:
+
+ ```jsx
+ // path ./src/plugins/my-plugin/strapi-server.js
+
+ module.exports = require('./server');
+ ```
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-front-end.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-front-end.md
new file mode 100644
index 0000000000..defeeca870
--- /dev/null
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-front-end.md
@@ -0,0 +1,197 @@
+---
+title: v4 Plugin Migration - Migrating the front end - Strapi Developer Docs
+description: Migrate the front end of a Strapi plugin from v3.6.8 to v4.0.x with step-by-step instructions
+canonicalUrl: http://docs.strapi.io/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-front-end.html
+next: ./enable-plugin.md
+---
+
+# v4 plugin migration: Migrating the front end
+
+!!!include(developer-docs/latest/update-migration-guides/migration-guides/v4/snippets/plugin-migration-intro.md)!!!
+
+Migrating the front end of a plugin to Strapi v4 requires:
+
+- updating how the plugin's front-end is [registered](#registering-the-plugin-with-the-admin-panel)
+- updating how the plugin is [added to the amin panel menu](#adding-a-menu-link)
+- optionally, [registering translations](#registering-translations)
+
+Migrating the front end of a plugin to Strapi v4 should be done entirely manually.
+
+:::strapi Going further with the new Admin Panel APIs
+Following this guide should help you migrate a basic plugin with a single view. However, the [Admin Panel APIs](/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md) introduced in Strapi v4 allow for further customization.
+
+In addition to the [`register()` lifecycle function](/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md#register), which is executed as soon as the plugin is loaded, a [`bootstrap()` lifecycle function](/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md#bootstrap) executes after all plugins are loaded.
+
+To add a settings link or section, use Redux reducers, hook into other plugins, and modify the user interface with injection zones, consult [the "available actions" table](/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md#available-actions) for all available APIs and their associated lifecycle functions.
+:::
+
+## Registering the plugin with the admin panel
+
+::: strapi v3/v4 comparison
+A Strapi v3 plugin is registered with the admin panel by using the `strapi.registerPlugin()` function in the `/admin/src/index.js` file.
+
+In Strapi v4, the plugin is registered within the [`register()` lifecycle function](/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md#register).
+:::
+
+To update the front-end registration of a plugin to Strapi v4:
+
+1. If it does not already exist, create an `admin/src/index.js` file at the root of the plugin folder.
+2. In the `/admin/src/index.js` file, export a function that calls the `register()` lifecycle function, passing the current Strapi application instance as an argument.
+3. Inside the `register()` lifecycle function body, call [the `registerPlugin()` function](/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md#registerplugin) on the application instance, grabbing the `name` and `id` keys from the Strapi v3 configuration object.
+4. Make sure that Strapi is aware of the plugin's front-end interface exported from `admin/src/index.js` by adding the following line to the `/strapi-admin.js` entry file:
+
+ ```jsx
+ module.exports = require('./admin/src').default;
+ ```
+
+::: details Example of a Strapi v4 plugin registration
+
+ ```jsx
+ // path: ./src/plugins/my-plugin/admin/src/index.js
+
+ import pluginId from './pluginId';
+
+ const pluginDescription = pluginPkg.strapi.description || pluginPkg.description;
+const { name } = pluginPkg.strapi;
+
+ export default {
+ register(app) {
+ // executes as soon as the plugin is loaded
+ app.registerPlugin({
+ id: pluginId
+ name,
+ })
+ }
+ }
+ ```
+
+ ```jsx
+ // path: .src/plugins/my-plugin/strapi-admin.js
+
+ module.exports = require('./admin/src').default;
+ ```
+
+:::
+
+## Adding a menu link
+
+::: strapi v3/v4 comparison
+A Strapi v3 plugin adds a link to the menu in the admin panel by exporting a `menu` object during the plugin registration.
+
+In Strapi v4, a plugin adds a link to the menu with the [`addMenuLink()` function](/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md#menu-api) called in the `register` lifecycle.
+:::
+
+To migrate to Strapi v4, pass the `menu` key from the Strapi v3 configuration object to `app.addMenuLink()` with the following properties updated:
+
+| Property name and type in v3 | Equivalent in v4 |
+| ------------------------------------------------- | ---------------------------- |
+| `destination` (String) | `to` (String) |
+| `label` (String) | `intlLabel` (String) |
+| `icon` (String)
`mainComponent` (String) | `` (React component) |
+
+The React-based icon component can be created in a separate file.
+
+::: details Example of an PluginIcon component
+
+```jsx
+// path: ./src/plugins/my-plugin/admin/src/components/PluginIcon/index.js
+
+import React from "react";
+import { Icon } from "@strapi/parts/Icon";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+
+const PluginIcon = () => (
+ } width="16px" />
+);
+
+export default PluginIcon;
+```
+
+:::
+
+In Strapi v3 the icon component is specified on the `mainComponent` key, in Strapi v4 the component is passed as a dynamic import to the `app.addMenuLink()` function.
+
+::: details Example of adding a menu link with a custom plugin icon component
+
+```jsx
+// path: ./src/plugins/my-plugin/admin/src/index.js
+
+import pluginId from './pluginId';
+import pluginPermissions from './permissions';
+import PluginIcon from './PluginIcon'
+
+const pluginDescription = pluginPkg.strapi.description || pluginPkg.description;
+const { name } = pluginPkg.strapi;
+
+export default {
+ register(app) {
+ app.addMenuLink({
+ to: `/plugins/${pluginId}`,
+ icon: PluginIcon,
+ intlLabel: {
+ id: `${pluginId}.plugin.name`,
+ defaultMessage: 'My Plugin',
+ },
+ permissions: pluginPermissions.main,
+ Component: async () => {
+ const component = await import(/* webpackChunkName: "my-plugin-page" */ './pages/PluginPage');
+
+ return component;
+ },
+ });
+
+ app.registerPlugin({
+ description: pluginDescription,
+ icon,
+ id: pluginId
+ name
+ });
+ }
+}
+```
+
+:::
+
+## Registering translations
+
+In Strapi v4, the front-end plugin interface can export an [asynchronous `registerTrads()` function](/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md#async-function) for registering translation files.
+
+::: details Example of translation registration
+
+```jsx
+import { prefixPluginTranslations } from "@strapi/helper-plugin";
+
+export default {
+ register(app) {
+ // register code...
+ },
+ bootstrap(app) {
+ // bootstrap code...
+ },
+ async registerTrads({ locales }) {
+ const importedTrads = await Promise.all(
+ locales.map((locale) => {
+ return import(
+ /* webpackChunkName: "[pluginId]-[request]" */ `./translations/${locale}.json`
+ )
+ .then(({ default: data }) => {
+ return {
+ data: prefixPluginTranslations(data, pluginId),
+ locale,
+ };
+ })
+ .catch(() => {
+ return {
+ data: {},
+ locale,
+ };
+ });
+ })
+ );
+
+ return Promise.resolve(importedTrads);
+ },
+};
+```
+
+:::
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/update-folder-structure.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/update-folder-structure.md
new file mode 100644
index 0000000000..e736d132e9
--- /dev/null
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/update-folder-structure.md
@@ -0,0 +1,372 @@
+---
+title: v4 Plugin Migration - Updating the folder structure - Strapi Developer Docs
+description: Migrate the folder structure of a Strapi plugin from v3.6.8 to v4.0.x with step-by-step instructions
+canonicalUrl: http://docs.strapi.io/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/update-folder-structure.html
+sidebarDepth: 2
+---
+
+# v4 plugin migration: Updating the folder structure
+
+!!!include(developer-docs/latest/update-migration-guides/migration-guides/v4/snippets/plugin-migration-intro.md)!!!
+
+::: strapi v3/v4 comparison
+Strapi v3 plugins required a specific folder structure.
+
+In Strapi v4, plugins are developed using a programmatic API, which gives flexibility in the folder structure.
+:::
+
+The folder structure of a Strapi v4 plugin should meet the following requirements:
+
+- The root of the plugin folder should include:
+ - a `strapi-server.js` entry file, if the plugin interacts with Strapi's back-end (see [Server API](/developer-docs/latest/developer-resources/plugin-api-reference/server.md))
+ - a `strapi-admin.js` entry file, if the plugin interacts with Strapi's admin panel (see [Admin Panel API](/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md)).
+
+- `strapi-admin.js` and `strapi-server.js` should export the plugin's interface.
+
+As long as these requirements are met, the rest of the folder structure is up to you.
+
+::: details Example of a Strapi v4 plugin structure
+
+```jsx
+my-plugin
+├─ admin
+│ └─ src
+│ ├─ components
+│ ├─ pages
+│ ├─ // more folders and files
+│ └─ index.js
+├─ server
+│ ├─ config
+│ ├─ content-types
+│ ├─ controllers
+│ ├─ middlewares
+│ ├─ policies
+│ ├─ routes
+│ ├─ services
+│ ├─ bootstrap.js
+│ ├─ destroy.js
+│ ├─ register.js
+│ ├─ // more folders and files
+│ └─ index.js
+├─ strapi-admin.js // require('./admin')
+└─ strapi-server.js // require('./server')
+```
+
+:::
+
+The folder structure of a Strapi v3 plugin can be migrated to a v4 plugin either [automatically](#updating-folder-structure-automatically) or [manually](#updating-folder-structure-manually).
+
+## Updating folder structure automatically
+
+::: caution
+The codemod creates a new Strapi v4 plugin, leaving the Strapi v3 plugin in place. We recommend confirming the v4 version of the plugin is working properly before deleting the v3 version.
+:::
+
+A codemod can be used to automatically update the folder structure of a plugin for Strapi v4. The codemod performs the following actions:
+
+- creation of 2 entry files: `strapi-server.js` and `strapi-admin.js`,
+- organization of files and folders into a `server` and an `admin` folders, respectively,
+- conversion of `models` to `contentTypes`,
+- and export of `services` as functions.
+
+To execute the codemod, run the following commands in a terminal:
+
+```sh
+npx @strapi/codemods migrate:plugin [path-for-v4-plugin]
+```
+
+## Updating folder structure manually
+
+Manually updating the folder structure requires moving and updating the content of multiple files and folders. These steps are described in the following subsections.
+
+:::note
+The folder structure is given as an example, and files and folders can be organized freely as long as `strapi-server.js` or `strapi-admin.js` exist and export the plugin interface.
+:::
+
+### Creating a `server` folder
+
+The `server` folder includes all the code for the back end of the plugin. To create it at the root of the plugin folder, run the following command in a terminal:
+
+```sh
+cd
+mkdir server
+```
+
+### Moving controllers, services, and middlewares
+
+:::strapi v3/v4 comparison
+In Strapi v3, controllers, services, and middlewares of a plugin must follow a strict folder structure convention.
+
+In Strapi v4, the organization of files and folders for plugins is flexible. However, it is recommended to create dedicated folders for every type of back-end element (e.g. [controllers](/developer-docs/latest/developer-resources/plugin-api-reference/server.md#controllers), [services](/developer-docs/latest/developer-resources/plugin-api-reference/server.md#services), and [middlewares](/developer-docs/latest/developer-resources/plugin-api-reference/server.md#middlewares)) inside a `server` folder (see [project structure](/developer-docs/latest/setup-deployment-guides/file-structure.md)).
+
+:::
+
+To update the controllers, services, and middlewares of a plugin to Strapi v4, create specific sub-folders in a `server` folder.
+
+Plugin files and folders in Strapi v4 should meet 2 requirements:
+
+- Each file in the `server//` (e.g. `server/controllers/my-controller.js`) should:
+ * export a function taking the `strapi` instance (object) as a parameter
+ * and return an object.
+- Each of the `server/` folders should include an `index.js` file that exports all files in the folder.
+
+::: details Example of files and folder for Strapi v4 plugin controllers
+
+```jsx
+// path: ./src/plugins/my-plugin/server/controllers/my-controllerA.js
+
+module.exports = ({ strapi }) => ({
+ doSomething(ctx) {
+ ctx.body = { message: "HelloWorld" };
+ },
+});
+```
+
+```jsx
+// path: ./src/plugins/my-plugin/server/controllers/index.js
+
+"use strict";
+
+const myControllerA = require("./my-controllerA");
+const myControllerB = require("./my-controllerB");
+
+module.exports = {
+ myControllerA,
+ myControllerB,
+};
+
+```
+
+:::
+
+### Moving the `bootstrap` function
+
+:::strapi v3/v4 comparison
+Strapi v3 has a dedicated `config/functions` folder for each plugin.
+
+In Strapi v4, the `config` folder does not necessarily exist for a plugin and [the `bootstrap` function](/developer-docs/latest/developer-resources/plugin-api-reference/server.md#bootstrap) and other lifecycle functions can be declared elsewhere.
+:::
+
+To update the plugin's `bootstrap` function to Strapi v4:
+
+- move the `bootstrap()` function from `server/config/functions/bootstrap.js` to `server/bootstrap.js`
+- pass the `strapi` instance (object) as a parameter
+
+```jsx
+// path: ./src/plugins/my-plugin/server/bootstrap.js
+
+"use strict";
+
+module.exports = ({ strapi }) => ({
+ // bootstrap the plugin
+});
+```
+
+### Moving routes
+
+:::strapi v3/v4 comparison
+Strapi v3 declares routes for a plugin in a specific `config/routes.json` file.
+
+In Strapi v4, the `config` folder does not necessarily exist for a plugin and [plugin routes](/developer-docs/latest/developer-resources/plugin-api-reference/server.md#routes) can be declared in a `server/routes/index.json` file.
+:::
+
+To update plugin routes to Strapi v4, move routes from `config/routes.json` to `server/routes/index.json`.
+
+Routes in Strapi v4 should meet 2 requirements:
+
+- Routes should return an array or an object specifying `admin` or `content-api` routes.
+- Routes handler names should match the same casing as the controller exports.
+
+::: details Example of controllers export and routes in a Strapi v4 plugin
+
+```jsx
+// path: ./src/plugins/my-plugin/server/controllers/index.js
+
+"use strict";
+
+const myControllerA = require("./my-controllerA");
+const myControllerB = require("./my-controllerB");
+
+module.exports = {
+ myControllerA,
+ myControllerB,
+};
+```
+
+```jsx
+// path: ./src/plugins/my-plugin/server/routes/index.js
+
+module.exports = [
+ {
+ method: "GET",
+ path: "/my-controller-a",
+ // Camel case handler to match export in server/controllers/index.js
+ handler: "myControllerA.doSomething",
+ config: { policies: [] },
+ },
+];
+```
+
+:::
+
+### Moving policies
+
+:::strapi v3/v4 comparison
+Strapi v3 declares policies for a plugin in a specific `config/policies` folder.
+
+In Strapi v4, the `config` folder does not necessarily exist for a plugin and [plugin policies](/developer-docs/latest/developer-resources/plugin-api-reference/server.md#policies) can be declared in dedicated files found under `server/policies`.
+:::
+
+To update plugin policies to Strapi v4:
+
+1. Move policies from `config/policies` to `server/policies/.js`
+
+2. Add an `index.js` file to the `server/policies` folder and make sure it exports all files in the folder.
+
+### Converting models to content-types
+
+:::strapi v3/v4 comparison
+Strapi v3 declares plugin models in `.settings.json` files found in a `models` folder.
+
+In Strapi v4, [plugin content-types](/developer-docs/latest/developer-resources/plugin-api-reference/server.md#content-types) are declared in `schema.json` files found in a `server/content-types/` folder. The `schema.json` files introduce some new properties (see [schema documentation](/developer-docs/latest/development/backend-customization/models.md#model-schema)).
+:::
+
+To convert Strapi v3 models to v4 content-types:
+
+1. Move the `models` folder under the `server` folder and rename `models` to `content-types`:
+
+ ```sh
+ mv models/ server/content-types/
+ ```
+
+2. Move/rename each model's `.settings.json` file to `server/content-types//schema.json` files.
+3. In each `/schema.json` file, update [the `info` object](/developer-docs/latest/development/backend-customization/models.md#model-information), which now requires declaring the 3 new `singularName`, `pluralName` and `displayName` keys and respecting some case-formatting conventions:
+
+ ```json
+ // path: ./src/plugins/my-plugin/content-types//schema.json
+
+ // ...
+ "info": {
+ "singularName": "content-type-name", // kebab-case required
+ "pluralName": "content-type-names", // kebab-case required
+ "displayName": "Content-type name",
+ "name": "Content-type name",
+ };
+ // ...
+ ```
+
+4. (_optional_) If the Strapi v3 model uses lifecycle hooks found in `.js`, move/rename the file to `server/content-types//lifecycle.js`, otherwise delete the file.
+5. Create an `index.js` file for each content-type to export the schema and, optionally, lifecycle hooks:
+
+ ```jsx
+ // path: ./src/plugins/my-plugin/server/content-types//index.js
+
+ const schema = require("./schema.json");
+ const lifecycles = require("./lifecycles.js"); // optional
+
+ module.exports = {
+ schema,
+ lifecycles, // optional
+ };
+ ```
+
+6. Create a `server/content-types/index.js` file.
+7. In `server/content-types/index.js`, export all content-types and make sure the key of each content-type matches the `singularName` found in the `info` object of the content-type’s `schema.json` file:
+
+ ```json
+ // path: ./src/plugins/my-plugin/server/content-types/content-type-a/schema.json
+
+ "info": {
+ "singularName": "content-type-a", // kebab-case required
+ "pluralName": "content-type-as", // kebab-case required
+ "displayName": "Content-Type A",
+ "name": "Content-Type A",
+ };
+ ```
+
+ ```jsx
+ // path: ./src/plugins/my-plugin/server/content-types/index.js
+
+ "use strict";
+
+ const contentTypeA = require("./content-type-a");
+ const contentTypeB = require("./content-type-b");
+
+ module.exports = {
+ // Key names should match info.singularName key values found in corresponding schema.json files
+ "content-type-a": contentTypeA,
+ "content-type-b": contentTypeB,
+ };
+ ```
+
+:::note
+Converting Strapi v3 models to v4 content-types also requires updating getters and, optionally, relations (see [plugin back end migration documentation](/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-back-end.md)).
+:::
+
+### Creating entry files
+
+::: strapi v3/v4 comparison
+Strapi v3 plugins use a strict folder structure convention.
+
+In Strapi v4, the folder structure for plugins is flexible. However, each plugin needs at least a `strapi-server.js` entry file or a `strapi-admin.js` entry file. The 2 entry files are used to take advantage of, respectively, the [Server API](/developer-docs/latest/developer-resources/plugin-api-reference/server.md) for the back end of the plugin and the [Admin Panel API](/developer-docs/latest/developer-resources/plugin-api-reference/admin-panel.md) for the front end of the plugin.
+:::
+
+To update the plugin to Strapi v4:
+
+- If the plugin interacts with Strapi's backend, create the `strapi-server.js` back-end entry file at the root of the plugin folder. The file should require all necessary files and export the back-end plugin interface (see [migrating the back end of a plugin](/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-back-end.md)).
+
+ ::: details Example strapi-server.js and server/index.js entry files
+
+ ```js
+ // path: ./src/plugins/my-plugin/strapi-server.js
+
+ "use strict";
+
+ module.exports = require('./server');
+ ```
+
+ ```js
+ // path: ./src/plugins/my-plugin/server/index.js:
+
+ "use strict";
+
+ const register = require('./register');
+ const bootstrap = require('./bootstrap');
+ const destroy = require('./destroy');
+ const config = require('./config');
+ const contentTypes = require('./content-types');
+ const controllers = require('./controllers');
+ const routes = require('./routes');
+ const middlewares = require('./middlewares');
+ const policies = require('./policies');
+ const services = require('./services');
+
+ module.exports = {
+ register,
+ bootstrap,
+ destroy,
+ config,
+ controllers,
+ routes,
+ services,
+ contentTypes,
+ policies,
+ middlewares,
+ };
+ ```
+
+ :::
+
+- If the plugin interacts with Strapi's admin panel, create the `strapi-admin.js` front-end entry file at the root of the plugin folder. The file should require all necessary files and export the front-end plugin interface (see [migrating the front end of a plugin](/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin/migrate-front-end.md)).
+
+ ::: details Example strapi-admin.js entry file
+
+ ```jsx
+ // path: ./src/plugins/my-plugin/strapi-admin.js
+
+ "use strict";
+
+ module.exports = require("./admin/src").default;
+ ```
+
+ :::
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/snippets/codemod-modify-source-code.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/snippets/codemod-modify-source-code.md
new file mode 100644
index 0000000000..bfb67c00a5
--- /dev/null
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/snippets/codemod-modify-source-code.md
@@ -0,0 +1 @@
+Codemods modify the plugin source code. Before running a command, make sure you have initialized a git repo, the working tree is clean, you've pushed your v3 plugin, and you are on a new branch.
diff --git a/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/snippets/plugin-migration-intro.md b/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/snippets/plugin-migration-intro.md
new file mode 100644
index 0000000000..d695545a47
--- /dev/null
+++ b/docs/developer-docs/latest/update-migration-guides/migration-guides/v4/snippets/plugin-migration-intro.md
@@ -0,0 +1 @@
+This guide is part of the [v4 plugin migration guide](/developer-docs/latest/update-migration-guides/migration-guides/v4/plugin-migration.md) designed to help you migrate a plugin from Strapi v3.6.8 to v4.0.x.
diff --git a/docs/package.json b/docs/package.json
index 62bdba061e..97063beb54 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -3,10 +3,14 @@
"version": "4.0.0",
"main": "index.js",
"scripts": {
- "dev": "vuepress dev",
- "build": "vuepress build",
+ "dev": "yarn create:config-file && vuepress dev",
+ "dev:dev": "yarn create:dev-config-file && vuepress dev",
+ "dev:user": "yarn create:user-config-file && vuepress dev",
+ "build": "yarn create:config-file && vuepress build",
"check-links": "vuepress check-md",
- "lint": ""
+ "create:config-file": "node ./scripts/create-main-config-file.js",
+ "create:dev-config-file": "node ./scripts/create-developer-docs-config-file.js",
+ "create:user-config-file": "node ./scripts/create-user-docs-config-file.js"
},
"dependencies": {
"@vuepress/plugin-medium-zoom": "^1.8.2",
diff --git a/docs/scripts/create-developer-docs-config-file.js b/docs/scripts/create-developer-docs-config-file.js
new file mode 100644
index 0000000000..f6eaa9e2a5
--- /dev/null
+++ b/docs/scripts/create-developer-docs-config-file.js
@@ -0,0 +1,47 @@
+'use strict';
+
+const path = require('path');
+const fs = require('fs-extra');
+
+const createConfigFile = async () => {
+ const dest = path.resolve(__dirname, '..', '.vuepress', 'config');
+ const developerSidebar = await fs.readFile(path.resolve(dest, 'sidebar-developer.js'));
+ const plugins = await fs.readFile(path.resolve(dest, 'plugins.js'));
+ const metas = await fs.readFile(path.resolve(dest, 'metas.js'));
+ const themeConfig = await fs.readFile(path.resolve(dest, 'theme-config.js'));
+ const markdown = await fs.readFile(path.resolve(dest, 'markdown.js'));
+ const patterns = await fs.readFile(path.resolve(dest, 'patterns-developer.js'));
+
+ const content = `
+${developerSidebar.toString()}
+
+const sidebar = {
+ developer,
+};
+
+${plugins.toString()}
+
+${metas.toString()};
+
+${themeConfig.toString()}
+
+${markdown.toString()}
+
+${patterns.toString()}
+
+
+module.exports = {
+ ...metas,
+ themeConfig,
+ markdown,
+ plugins,
+ patterns
+};
+ `;
+
+ const destination = path.resolve(__dirname, '..', '.vuepress', 'config.js');
+
+ await fs.writeFile(destination, content);
+};
+
+createConfigFile();
diff --git a/docs/scripts/create-main-config-file.js b/docs/scripts/create-main-config-file.js
new file mode 100644
index 0000000000..189d38852d
--- /dev/null
+++ b/docs/scripts/create-main-config-file.js
@@ -0,0 +1,48 @@
+'use strict';
+
+const path = require('path');
+const fs = require('fs-extra');
+
+const createConfigFile = async () => {
+ const dest = path.resolve(__dirname, '..', '.vuepress', 'config');
+ const plugins = await fs.readFile(path.resolve(dest, 'plugins.js'));
+ const metas = await fs.readFile(path.resolve(dest, 'metas.js'));
+ const themeConfig = await fs.readFile(path.resolve(dest, 'theme-config.js'));
+ const markdown = await fs.readFile(path.resolve(dest, 'markdown.js'));
+ const developerSidebar = await fs.readFile(path.resolve(dest, 'sidebar-developer.js'));
+ const userSidebar = await fs.readFile(path.resolve(dest, 'sidebar-user.js'));
+
+ const content = `
+${developerSidebar.toString()}
+
+${userSidebar.toString()}
+
+const sidebar = {
+ developer,
+ user,
+};
+
+${plugins.toString()}
+
+${metas.toString()};
+
+${themeConfig.toString()}
+
+${markdown.toString()}
+
+
+
+module.exports = {
+ ...metas,
+ themeConfig,
+ markdown,
+ plugins,
+};
+ `;
+
+ const destination = path.resolve(__dirname, '..', '.vuepress', 'config.js');
+
+ await fs.writeFile(destination, content);
+};
+
+createConfigFile();
diff --git a/docs/scripts/create-user-docs-config-file.js b/docs/scripts/create-user-docs-config-file.js
new file mode 100644
index 0000000000..47b96b17b8
--- /dev/null
+++ b/docs/scripts/create-user-docs-config-file.js
@@ -0,0 +1,47 @@
+'use strict';
+
+const path = require('path');
+const fs = require('fs-extra');
+
+const createConfigFile = async () => {
+ const dest = path.resolve(__dirname, '..', '.vuepress', 'config');
+ const userSidebar = await fs.readFile(path.resolve(dest, 'sidebar-user.js'));
+ const plugins = await fs.readFile(path.resolve(dest, 'plugins.js'));
+ const metas = await fs.readFile(path.resolve(dest, 'metas.js'));
+ const themeConfig = await fs.readFile(path.resolve(dest, 'theme-config.js'));
+ const markdown = await fs.readFile(path.resolve(dest, 'markdown.js'));
+ const patterns = await fs.readFile(path.resolve(dest, 'patterns-user.js'));
+
+ const content = `
+${userSidebar.toString()}
+
+const sidebar = {
+ user,
+};
+
+${plugins.toString()}
+
+${metas.toString()};
+
+${themeConfig.toString()}
+
+${markdown.toString()}
+
+${patterns.toString()}
+
+
+module.exports = {
+ ...metas,
+ themeConfig,
+ markdown,
+ plugins,
+ patterns
+};
+ `;
+
+ const destination = path.resolve(__dirname, '..', '.vuepress', 'config.js');
+
+ await fs.writeFile(destination, content);
+};
+
+createConfigFile();
diff --git a/docs/user-docs/latest/content-manager/configuring-view-of-content-type.md b/docs/user-docs/latest/content-manager/configuring-view-of-content-type.md
index 019d6ee11c..c59e6918e1 100644
--- a/docs/user-docs/latest/content-manager/configuring-view-of-content-type.md
+++ b/docs/user-docs/latest/content-manager/configuring-view-of-content-type.md
@@ -1,12 +1,12 @@
---
-title: Configuring views of a content type - Strapi User Guide
-description: Instructions to configure the edit view and list view of a content type in a Strapi application.
+title: Configuring views of a content-type - Strapi User Guide
+description: Instructions to configure the edit view and list view of a content-type in a Strapi application.
canonicalUrl: https://docs.strapi.io/user-docs/latest/content-manager/configuring-view-of-content-type.html
---
-# Configuring the views of a content type
+# Configuring the views of a content-type
-Depending on their type, content types can be divided into 2 interfaces: the list view and the edit view. Both interfaces can be configured.
+Depending on their type, content-types can be divided into 2 interfaces: the list view and the edit view. Both interfaces can be configured.
## Configuring the list view
@@ -15,7 +15,7 @@ On the right side of the list view interface, right above the table, a settings
::: note
The configurations only apply to the list view of the collection type from which the settings are accessed (i.e. disabling the filters or search options for a collection type will not automatically also disable these same options for all other collection types).
-Note also that the explanations below explain how to permanently configure which fields are displayed in the table of the list view of your collection type. It is also possible to configure the displayed fields temporarily (see [Introduction to content manager](../content-manager/introduction-to-content-manager.md)).
+Note also that the explanations below explain how to permanently configure which fields are displayed in the table of the list view of your collection type. It is also possible to configure the displayed fields temporarily (see [Introduction to Content Manager](../content-manager/introduction-to-content-manager.md)).
:::

@@ -67,13 +67,13 @@ Note also that relational fields have a couple limitations when it comes to sort
## Configuring the edit view
-In the edit view of a content type, in the right side of the interface, a **Configure the view** button is displayed. It allows to access the configurations that can be set for the edit view of the content type, such as the entry title, and the display of the fields of the content type, including the relational ones.
+In the edit view of a content-type, in the right side of the interface, a **Configure the view** button is displayed. It allows to access the configurations that can be set for the edit view of the content-type, such as the entry title, and the display of the fields of the content-type, including the relational ones.

### Edit view settings
-1. In the edit view of your content type, click on the **Configure the view** button.
+1. In the edit view of your content-type, click on the **Configure the view** button.
2. In the Settings area, define your chosen new settings:
| Setting name | Instructions |
@@ -84,7 +84,7 @@ In the edit view of a content type, in the right side of the interface, a **Conf
### Edit view display
-1. In the edit view of your content type, click on the **Configure the view** button.
+1. In the edit view of your content-type, click on the **Configure the view** button.
2. In the View area, define what fields to display in the list view table, and in what order:
- Click the add button  to add a new field.
- Click the delete button  to remove a field.
@@ -103,7 +103,7 @@ In the edit view of a content type, in the right side of the interface, a **Conf
::: caution
The settings and display of a component's fields cannot be managed and reordered through the entry's edit view configuration page. Click on the **Set the component's layout** button of a component to access the component's own configuration page. You will find the exact same settings and display options as for the entry, but that will specifically apply to your component.
-Note also that the settings are defined for the component itself, which means that the settings will automatically be applied for every other content type where the component is used.
+Note also that the settings are defined for the component itself, which means that the settings will automatically be applied for every other content-type where the component is used.
:::
#### Relational fields
diff --git a/docs/user-docs/latest/content-manager/introduction-to-content-manager.md b/docs/user-docs/latest/content-manager/introduction-to-content-manager.md
index 5e48488522..7b0c2a028f 100644
--- a/docs/user-docs/latest/content-manager/introduction-to-content-manager.md
+++ b/docs/user-docs/latest/content-manager/introduction-to-content-manager.md
@@ -8,15 +8,15 @@ canonicalUrl: https://docs.strapi.io/user-docs/latest/content-manager/introducti
The Content Manager is a core plugin of Strapi. It is a feature that is always activated by default and cannot be deactivated. It is accessible both when the application is in a development and production environment.
-The Content Manager is accessible from  *Content Manager* in the main navigation, which opens a subnavigation displaying 2 categories: _Collection types_ and _Single types_. Each category contains the available collection and single content-types which were created beforehand using the [Content-Type Builder](/user-docs/latest/content-types-builder/introduction-to-content-types-builder.md). From these 2 categories, administrators can create, manage, and publish content.
+The Content Manager is accessible from  *Content Manager* in the main navigation, which opens a sub navigation displaying 2 categories: _Collection types_ and _Single types_. Each category contains the available collection and single content-types which were created beforehand using the [Content-type Builder](/user-docs/latest/content-types-builder/introduction-to-content-types-builder.md). From these 2 categories, administrators can create, manage, and publish content.
::: tip
-Click the search icon  in the subnavigation to use a text search and find one of your content-types more quickly!
+Click the search icon  in the sub navigation to use a text search and find one of your content-types more quickly!
:::
## Collection types
-The _Collection types_ category of the Content Manager displays the list of available collection types which are accessible from the  Content Manager subnavigation.
+The _Collection types_ category of the Content Manager displays the list of available collection types which are accessible from the  Content Manager sub navigation.
For each available collection type multiple entries can be created which is why each collection type is divided into 2 interfaces: the list view and the edit view (see [Writing content](writing-content.md)).
@@ -33,7 +33,7 @@ From the list view, it is possible to:
- edit  (see [Writing content](../content-manager/writing-content.md)), duplicate , or delete  (see [Deleting content](../content-manager/saving-and-publishing-content.md#deleting-content)) an entry.
::: tip
-Sorting can be enabled for most fields displayed in the list view table (see [Configuring the views of a content type](../content-manager/configuring-view-of-content-type.md)). Click on a field name, in the header of the table, to sort on that field.
+Sorting can be enabled for most fields displayed in the list view table (see [Configuring the views of a content-type](../content-manager/configuring-view-of-content-type.md)). Click on a field name, in the header of the table, to sort on that field.
:::
### Filtering entries
@@ -69,7 +69,7 @@ New entries are only considered created once some of their content has been writ
Above the list view table, on the right, a "... currently selected" drop-down menu is displayed. It allows to choose which fields to display in the table.
::: note
-Configuring the displayed field of the table in the way detailed below is only temporary: the configurations will be reset as soon as the page is refreshed or when navigating the admin panel outside the Content Manager. For permanent configurations, go to the list view configuration interface by clicking on the settings button  (see [Configuring the views of a content type](../content-manager/configuring-view-of-content-type.md)).
+Configuring the displayed field of the table in the way detailed below is only temporary: the configurations will be reset as soon as the page is refreshed or when navigating the admin panel outside the Content Manager. For permanent configurations, go to the list view configuration interface by clicking on the settings button  (see [Configuring the views of a content-type](../content-manager/configuring-view-of-content-type.md)).
:::

@@ -81,12 +81,12 @@ To temporarily configure the fields displayed in the table:
3. Untick the boxes associated with the fields you do not want to be displayed in the table.
::: tip
-Relational fields can also be displayed in the list view. Please refer to [Configuring the views of a content type](../content-manager/configuring-view-of-content-type.md) for more information on their specificities.
+Relational fields can also be displayed in the list view. Please refer to [Configuring the views of a content-type](../content-manager/configuring-view-of-content-type.md) for more information on their specificities.
:::
## Single types
-The _Single types_ category of the Content Manager displays the list of available single types, which are accessible from the  Content Manager subnavigation.
+The _Single types_ category of the Content Manager displays the list of available single types, which are accessible from the  Content Manager sub navigation.
Unlike collection types which have multiple entries, single types are not created for multiple uses. In other words, there can only be one default entry per available single type. There is therefore no list view in the Single types category.
diff --git a/docs/user-docs/latest/content-manager/managing-relational-fields.md b/docs/user-docs/latest/content-manager/managing-relational-fields.md
index 12bb2bf6db..90f564dffa 100644
--- a/docs/user-docs/latest/content-manager/managing-relational-fields.md
+++ b/docs/user-docs/latest/content-manager/managing-relational-fields.md
@@ -6,7 +6,7 @@ canonicalUrl: https://docs.strapi.io/user-docs/latest/content-manager/managing-r
# Managing relational fields
-Relation-type fields added to a content-type from the Content-Type Builder allow to establish a relation with another content-type -mandatorily a collection type. These fields are called "relational fields".
+Relation-type fields added to a content-type from the Content-type Builder allow to establish a relation with another content-type -mandatorily a collection type. These fields are called "relational fields".
Relational fields are before all else regular fields, meaning that their content is written from the edit view of the content-type they belong to (see [Writing content](writing-content.md)).
diff --git a/docs/user-docs/latest/content-manager/saving-and-publishing-content.md b/docs/user-docs/latest/content-manager/saving-and-publishing-content.md
index a34ffc9075..5d72103d52 100644
--- a/docs/user-docs/latest/content-manager/saving-and-publishing-content.md
+++ b/docs/user-docs/latest/content-manager/saving-and-publishing-content.md
@@ -11,7 +11,7 @@ Strapi allows you to manage your content throughout its whole lifecycle, whether
## Saving & publishing content
::: caution
-The possibility to manage drafts for contents comes from the Draft & Publish feature. This feature is activated by default, but it can be deactivated for any content type from the Content-Type Builder. If you disabled the Draft & Publish feature, saving your content means saving and publishing at the same time.
+The possibility to manage drafts for contents comes from the Draft & Publish feature. This feature is activated by default, but it can be deactivated for any content-type from the Content-type Builder. If you disabled the Draft & Publish feature, saving your content means saving and publishing at the same time.
:::
Your contents can have 2 statuses: draft or published. You can see the current status indicated on the right of the interface, above the Information box.
diff --git a/docs/user-docs/latest/content-manager/writing-content.md b/docs/user-docs/latest/content-manager/writing-content.md
index e7acecec0e..614eba88ab 100644
--- a/docs/user-docs/latest/content-manager/writing-content.md
+++ b/docs/user-docs/latest/content-manager/writing-content.md
@@ -6,7 +6,7 @@ canonicalUrl: https://docs.strapi.io/user-docs/latest/content-manager/writing-co
# Writing content
-In Strapi, writing content consists in filling up fields, which are meant to contain specific content (e.g. text, numbers, media etc.). These fields were configured for the collection or single type beforehand, through the [Content-Type Builder](/user-docs/latest/content-types-builder/introduction-to-content-types-builder.md).
+In Strapi, writing content consists in filling up fields, which are meant to contain specific content (e.g. text, numbers, media etc.). These fields were configured for the collection or single type beforehand, through the [Content-type Builder](/user-docs/latest/content-types-builder/introduction-to-content-types-builder.md).

@@ -29,7 +29,7 @@ To write or edit content:
| Enumeration | 1. Click the drop-down list. 2. Choose an item from the list. |
| Media | 1. Click the media area. 2. Choose an asset from the Media Library, or click the **Add more assets** button to add a new file to the Media Library.
💡 It is possible to drag and drop the chosen file in the media area. |
| JSON | Write your content, in JSON format, in the code textbox. |
-| UID | Write a unique identifier in the textbox. A "Regenerate" button, displayed on the right of the box, allows to automatically generate a UID based on the content type name. |
+| UID | Write a unique identifier in the textbox. A "Regenerate" button, displayed on the right of the box, allows to automatically generate a UID based on the content-type name. |
### Components
@@ -69,7 +69,7 @@ The repeatable component entries can be reordered or deleted directly in the edi
- Use the delete button  to delete an entry from your repeatable component.
::: note
-Unlike regular fields, the order of the entries of a repeatable component is important. It should correspond exactly to how end-users will read/see the content.
+Unlike regular fields, the order of the entries of a repeatable component is important. It should correspond exactly to how end users will read/see the content.
:::
### Dynamic zones
@@ -89,7 +89,7 @@ Dynamic zones' components can also be reordered or deleted directly in the edit
- Use the delete button  to delete a component from your dynamic zone.
::: note
-Unlike regular fields, the order of the fields and components inside a dynamic field is important. It should correspond exactly to how end-users will read/see the content.
+Unlike regular fields, the order of the fields and components inside a dynamic field is important. It should correspond exactly to how end users will read/see the content.
:::
diff --git a/docs/user-docs/latest/content-types-builder/configuring-fields-content-type.md b/docs/user-docs/latest/content-types-builder/configuring-fields-content-type.md
index 6fa9761e64..d26e3eb2ea 100644
--- a/docs/user-docs/latest/content-types-builder/configuring-fields-content-type.md
+++ b/docs/user-docs/latest/content-types-builder/configuring-fields-content-type.md
@@ -1,19 +1,19 @@
---
title: Fields for Content Types - Strapi User Guide
-description: Instructions to configure in the Content-Type Builder the fields that compose each content-type.
+description: Instructions to configure in the Content-type Builder the fields that compose each content-type.
sidebarDepth: 3
canonicalUrl: https://docs.strapi.io/user-docs/latest/content-types-builder/configuring-fields-content-type.html
---
-# Configuring fields for content types
+# Configuring fields for content-types
-::: callout The Content-Type Builder is only accessible to create and update content-types when your Strapi application is in a development environment, else it will be in a read-only mode in other environments.
+::: callout The Content-type Builder is only accessible to create and update content-types when your Strapi application is in a development environment, else it will be in a read-only mode in other environments.
:::
Content-types are composed of one or several fields. Each field is designed to contain specific kind of data, filled up in the Content Manager (see [Writing content](/user-docs/latest/content-manager/writing-content.md)).
-In the Content-Type Builder, fields can be added at the creation of a new content-type or component, or afterward when a content-type or component is edited or updated. The following documentation lists all existing regular fields but also tackles the specificities of components and dynamic zones. For each, you will find a definition, explanation of the form they take once in the Content Manager, and instructions to configure them.
+In the Content-type Builder, fields can be added at the creation of a new content-type or component, or afterward when a content-type or component is edited or updated. The following documentation lists all existing regular fields but also tackles the specificities of components and dynamic zones. For each, you will find a definition, explanation of the form they take once in the Content Manager, and instructions to configure them.
::: note
Depending on what content-type or component is being created or edited, not all fields -including components and dynamic zones- are always available.
@@ -391,7 +391,7 @@ The UID field displays a field that sets a unique identifier, optionally based o
Components are a combination of several fields. Components allow to create reusable sets of fields, that can be quickly added to content-types, dynamic zones but also nested into other components.
-When configuring a component through the Content-Type Builder, it is possible to either:
+When configuring a component through the Content-type Builder, it is possible to either:
- create a new component by clicking on *Create a new component* (see [Creating a new component](/user-docs/latest/content-types-builder/creating-new-content-type.md#creating-a-new-component)),
- or use an existing one by clicking on *Use an existing component*.
diff --git a/docs/user-docs/latest/content-types-builder/creating-new-content-type.md b/docs/user-docs/latest/content-types-builder/creating-new-content-type.md
index ef97fccff5..41f7c2540f 100644
--- a/docs/user-docs/latest/content-types-builder/creating-new-content-type.md
+++ b/docs/user-docs/latest/content-types-builder/creating-new-content-type.md
@@ -1,22 +1,22 @@
---
title: Creating Content-Types - Strapi User Guide
-description: The Content-Type Builder allows to create new content-types (single and collection types).
+description: The Content-type Builder allows to create new content-types (single and collection types).
canonicalUrl: https://docs.strapi.io/user-docs/latest/content-types-builder/creating-new-content-type.html
---
# Creating content-types
-::: callout The Content-Type Builder is only accessible to create and update content-types when your Strapi application is in a development environment, else it will be in a read-only mode in other environments.
+::: callout The Content-type Builder is only accessible to create and update content-types when your Strapi application is in a development environment, else it will be in a read-only mode in other environments.
:::
-The Content-Type Builder allows to create new content-types: single and collection types. Although they are not proper content-types as they cannot exist independently, components can also be created through the Content-Type Builder, in the same way as collection and single types.
+The Content-type Builder allows to create new content-types: single and collection types. Although they are not proper content-types as they cannot exist independently, components can also be created through the Content-type Builder, in the same way as collection and single types.
## Creating a new content-type

-Content types are created from the Content-Type Builder's Collection types and Single types categories, both displayed in the Content-Type Builder subnavigation.
+Content types are created from the Content-type Builder's Collection types and Single types categories, both displayed in the Content-type Builder sub navigation.
To create a new content-type:
@@ -36,18 +36,18 @@ To create a new content-type:
8. Click on the **Save** button.
::: caution
-New content-types are only considered created once they have been saved. Saving is only possible if at least one field has been added and properly configured. If these steps have not been done, a content-type cannot be created, listed in its category in the Content-Type Builder, and cannot be used in the Content Manager.
+New content-types are only considered created once they have been saved. Saving is only possible if at least one field has been added and properly configured. If these steps have not been done, a content-type cannot be created, listed in its category in the Content-type Builder, and cannot be used in the Content Manager.
:::
## Creating a new component

-Components are created from the same-named category of the Content-Type Builder's subnavigation.
+Components are created from the same-named category of the Content-type Builder's sub navigation.
To create a new component:
-1. In the Components category of the Content-Type Builder subnavigation, click on **Create a new component**.
+1. In the Components category of the Content-type Builder sub navigation, click on **Create a new component**.
2. In the component creation window, configure the base settings of the new component:
- Write the name of the component in the *Name* textbox.
- Select an available category, or enter in the textbox a new category name to create one.
diff --git a/docs/user-docs/latest/content-types-builder/introduction-to-content-types-builder.md b/docs/user-docs/latest/content-types-builder/introduction-to-content-types-builder.md
index 998d114a79..028c0764c9 100644
--- a/docs/user-docs/latest/content-types-builder/introduction-to-content-types-builder.md
+++ b/docs/user-docs/latest/content-types-builder/introduction-to-content-types-builder.md
@@ -1,30 +1,30 @@
---
-title: Content-Type Builder - Strapi User Guide
-description: From the Content-Type Builder, administrators can create and manage content-types (collection types and single types but also components).
+title: Content-type Builder - Strapi User Guide
+description: From the Content-type Builder, administrators can create and manage content-types (collection types and single types but also components).
canonicalUrl: https://docs.strapi.io/user-docs/latest/content-types-builder/introduction-to-content-types-builder.html
---
-# Introduction to the Content-Type Builder
+# Introduction to the Content-type Builder
-The Content-Type Builder is a core plugin of Strapi. It is a feature that is always activated by default and cannot be deactivated. The Content-Type Builder is however only accessible when the application is in a development environment.
+The Content-type Builder is a core plugin of Strapi. It is a feature that is always activated by default and cannot be deactivated. The Content-type Builder is however only accessible when the application is in a development environment.
-Administrators can access the Content-Type Builder from  _Content-Type Builder_ in the main navigation of the admin panel.
+Administrators can access the Content-type Builder from  _Content-type Builder_ in the main navigation of the admin panel.
-
+
-From the Content-Type Builder, administrators can create and manage content-types: collection types and single types but also components.
+From the Content-type Builder, administrators can create and manage content-types: collection types and single types but also components.
- Collection types are content-types that can manage several entries.
- Single types are content-types that can only manage one entry.
- Components are a data structure that can be used in multiple collection types and single types.
-All 3 are displayed as categories in the subnavigation of the Content-Type Builder. In each category are listed all content-types and components that have already been created.
+All 3 are displayed as categories in the sub navigation of the Content-type Builder. In each category are listed all content-types and components that have already been created.
-From each category of the Content-Type Builder subnavigation, it is possible to:
+From each category of the Content-type Builder sub navigation, it is possible to:
- click on an existing content-type or component to access it and edit it (see [Managing content-types](/user-docs/latest/content-types-builder/managing-content-types.md)),
- or create a new content-type or component (see [Creating content-types](/user-docs/latest/content-types-builder/creating-new-content-type.md)).
::: tip
-Click the search icon  in the Content-Type Builder subnavigation to find a specific collection type, single type, or component.
+Click the search icon  in the Content-type Builder sub navigation to find a specific collection type, single type, or component.
:::
diff --git a/docs/user-docs/latest/content-types-builder/managing-content-types.md b/docs/user-docs/latest/content-types-builder/managing-content-types.md
index c3a0d6e063..f424917f16 100644
--- a/docs/user-docs/latest/content-types-builder/managing-content-types.md
+++ b/docs/user-docs/latest/content-types-builder/managing-content-types.md
@@ -1,24 +1,24 @@
---
title: Managing Content-types - Strapi User Guide
-description: The Content-Type Builder allows to manage any existing content-type or component, even if it is already being used in the Content Manager. They can only be managed one at a time.
+description: The Content-type Builder allows to manage any existing content-type or component, even if it is already being used in the Content Manager. They can only be managed one at a time.
canonicalUrl: https://docs.strapi.io/user-docs/latest/content-types-builder/managing-content-types.html
---
# Managing content-types
-::: callout The Content-Type Builder is only accessible to create and update content-types when your Strapi application is in a development environment, else it will be in a read-only mode in other environments.
+::: callout The Content-type Builder is only accessible to create and update content-types when your Strapi application is in a development environment, else it will be in a read-only mode in other environments.
:::
-The Content-Type Builder allows to manage any existing content-type or component, even if it is already being used in the Content Manager. They can only be managed one at a time.
+The Content-type Builder allows to manage any existing content-type or component, even if it is already being used in the Content Manager. They can only be managed one at a time.
-To manage a content-type or a component, click on its name in the Collection Types, Single Types or Components category.
+To manage a content-type or a component, click on its name in the Collection types, Single types or Components category.
## Editing content-types
-Managing a content-type or component can include editing the general settings and the fields, but also deleting the whole content-type or component. For any chosen content-type of component, the right side of the Content-Type Builder interface displays all available editing options.
+Managing a content-type or component can include editing the general settings and the fields, but also deleting the whole content-type or component. For any chosen content-type of component, the right side of the Content-type Builder interface displays all available editing options.
-
+
- Next to the name and optional description of the content-type or component, an  **Edit** button (1) allows to access the general settings of the content-type or component.
- In the top right corner:
@@ -35,15 +35,15 @@ Editing a field allows renaming it. However, keep in mind that regarding the dat
## Deleting content-types
-Content types and components can be deleted through the Content-Type Builder. Deleting a content-type automatically deletes all entries from the Content Manager that were based on that content-type. The same goes for the deletion of a component, which is automatically deleted from every content-type or entry where it was used.
+Content types and components can be deleted through the Content-type Builder. Deleting a content-type automatically deletes all entries from the Content Manager that were based on that content-type. The same goes for the deletion of a component, which is automatically deleted from every content-type or entry where it was used.
To delete a content-type or component:
-1. In the Content-Type Builder subnavigation, click on the name of the content-type or component to delete.
+1. In the Content-type Builder sub navigation, click on the name of the content-type or component to delete.
2. In the edition interface of the chosen content-type or component, click on the  **Edit** button on the right side of the content-type's or component's name.
3. In the edition window, click on the **Delete** button.
4. In the confirmation window, confirm the deletion.
::: caution
-Deleting a content-type only deletes what was created and available from the Content-Type Builder, and by extent from the admin panel of your Strapi application. All the data that was created based on that content-type is however kept in the database. For more information, please refer to the related [GitHub issue](https://github.com/strapi/strapi/issues/1114).
+Deleting a content-type only deletes what was created and available from the Content-type Builder, and by extent from the admin panel of your Strapi application. All the data that was created based on that content-type is however kept in the database. For more information, please refer to the related [GitHub issue](https://github.com/strapi/strapi/issues/1114).
:::
diff --git a/docs/user-docs/latest/getting-started/introduction.md b/docs/user-docs/latest/getting-started/introduction.md
index 1f9d7c05f5..e4d6327c06 100644
--- a/docs/user-docs/latest/getting-started/introduction.md
+++ b/docs/user-docs/latest/getting-started/introduction.md
@@ -13,19 +13,19 @@ This user guide contains the functional documentation related to all features av
Before going any further into this user guide, we recommend you to acknowledge the main concepts below. They will help you to understand how Strapi works, and ensure a smooth Strapi experience.
-- **Development, Staging or Production Environment** When you start working on your application, it is in a development environment, which is the status for the content structure and application configuration. After deploying your application, it is in production or staging environment. This status change impacts how you can use your Strapi application, as some features are only available in development environment, such as the Content-Type Builder. In this user guide the availability or not of a feature, depending on the application status, is always mentioned in the feature's introduction.
+- **Development, Staging or Production Environment** When you start working on your application, it is in a development environment, which is the status for the content structure and application configuration. After deploying your application, it is in production or staging environment. This status change impacts how you can use your Strapi application, as some features are only available in development environment, such as the Content-type Builder. In this user guide the availability or not of a feature, depending on the application status, is always mentioned in the feature's introduction.
- **Versions** Strapi is constantly evolving and growing. This implies that new releases are quite frequent, to improve what is already available but also to add new features to Strapi. For every new Strapi version, we communicate through our main channels and by sending notifications both on your terminal (when launching your Strapi application), and on your application's admin panel. We always recommend to use the latest version. However, we always keep live both the documentation of the current Strapi version, and the documention of the previous one - the latter being officially and actively maintained for 6 months after the release of the newest Strapi version.
- **License and Pricing Plans** As a Strapi user you have the choice between using the Community Edition, which is entirely free, or one of the 3 paid plans of the Enterprise Edition: Bronze, Silver, and Gold (see [Pricing and Plans](https://strapi.io/pricing-self-hosted)). In this user guide if a feature is only available for the Enterprise Edition, a badge is displayed beside the section's title to indicate which plans allow access to that feature (e.g. ).
-- **Roles and Permissions** Some features of the admin panel, as well as the content managed with Strapi itself, are ruled by a system of permissions. From your Strapi admin panel, you have the possibility to define, at a detailed level, the roles and permissions of all administrators and end-users. In this user guide, all features and possible options are documented. It is however possible, depending on your role and permissions, that you may not be able to access all these features and options. In that case, please refer to the main Super Admin of your Strapi application.
+- **Roles and Permissions** Some features of the admin panel, as well as the content managed with Strapi itself, are ruled by a system of permissions. From your Strapi admin panel, you have the possibility to define, at a detailed level, the roles and permissions of all administrators and end users. In this user guide, all features and possible options are documented. It is however possible, depending on your role and permissions, that you may not be able to access all these features and options. In that case, please refer to the main Super Admin of your Strapi application.
With all this in mind, you should be ready to start your Strapi experience!
## Accessing the admin panel
-The admin panel is the back office of your Strapi application. From the admin panel, you will be able to manage content types, and write their actual content. It is also from the admin panel that you will manage users, both administrators and end-users of your Strapi application.
+The admin panel is the back office of your Strapi application. From the admin panel, you will be able to manage content-types, and write their actual content. It is also from the admin panel that you will manage users, both administrators and end users of your Strapi application.
::: caution
In order to access the admin panel, your Strapi application must be launched, and you must be aware of the URL to its admin panel (e.g. `api.example.com/admin`).
diff --git a/docs/user-docs/latest/plugins/introduction-to-plugins.md b/docs/user-docs/latest/plugins/introduction-to-plugins.md
index c6b867f64f..583e9f34d7 100644
--- a/docs/user-docs/latest/plugins/introduction-to-plugins.md
+++ b/docs/user-docs/latest/plugins/introduction-to-plugins.md
@@ -9,7 +9,7 @@ canonicalUrl: https://docs.strapi.io/user-docs/latest/plugins/introduction-to-pl
Strapi is built around plugins of different kinds. There are the core plugins which are essential for your Strapi application to function, and therefore cannot be deactivated. But there are also other plugins, that can either be installed by default or not, to add more options and possibilities to your Strapi application.
::: note
-Core plugins which include the Content Manager and the Content-Type Builder are documented in their own sections of the user guide as they are quite specific (see [Introduction to the Content Manager](../content-manager/introduction-to-content-manager.md) and [Introduction to the Content-Type Builder](../content-types-builder/introduction-to-content-types-builder.md)). This Plugins section focuses on how to manage plugins in general and provides documentation for the others, non-core plugins.
+Core plugins which include the Content Manager and the Content-type Builder are documented in their own sections of the user guide as they are quite specific (see [Introduction to the Content Manager](../content-manager/introduction-to-content-manager.md) and [Introduction to the Content-type Builder](../content-types-builder/introduction-to-content-types-builder.md)). This Plugins section focuses on how to manage plugins in general and provides documentation for the others, non-core plugins.
:::
Plugins are managed, for anything related to installation and deletion, from  _Marketplace_ and  _Plugins_, both available in the main navigation of the admin panel. Once installed, your plugins are added to the main navigation of the admin panel, from where they are directly accessible.
diff --git a/docs/user-docs/latest/plugins/strapi-plugins.md b/docs/user-docs/latest/plugins/strapi-plugins.md
index 4f6ea41050..7e322dcf4b 100644
--- a/docs/user-docs/latest/plugins/strapi-plugins.md
+++ b/docs/user-docs/latest/plugins/strapi-plugins.md
@@ -31,7 +31,7 @@ The Internationalization plugin impacts several parts of the admin panel. The ta
| Section impacted | Options and settings |
|------------------|---------------------------------------------------------------------------------------------------------|
| Settings |
Addition of a new "Internationalization" setting sub-section, from which to add, edit or delete locales available for the application (see [Configuring Internationalization locales](../settings/managing-global-settings.md#configuring-internationalization-locales)). 👉 Path reminder:  *Settings > Global Settings > Internationalization*
Addition of new permissions for administator roles: access to content-types, as well as possible actions on the content-types, can be defined depending on the locale (see [Configuring role's permissions](/user-docs/latest/users-roles-permissions/configuring-administrator-roles.md#configuring-role-s-permissions)). 👉 Path reminder:  *Settings > Administration panel*
|
-| Content-Type Builder |
Addition of a new setting at content-type level, to allow or not localisation/translation of the content-type (see [Creating a new content-type](/user-docs/latest/content-types-builder/creating-new-content-type.md#creating-a-new-content-type)).
Addition of a new setting at field level, to allow or not localisation/translation of the content-type (see [Configuring fields for content types](/user-docs/latest/content-types-builder/configuring-fields-content-type.md#regular-fields)).
|
+| Content-type Builder |
Addition of a new setting at content-type level, to allow or not localisation/translation of the content-type (see [Creating a new content-type](/user-docs/latest/content-types-builder/creating-new-content-type.md#creating-a-new-content-type)).
Addition of a new setting at field level, to allow or not localisation/translation of the content-type (see [Configuring fields for content-types](/user-docs/latest/content-types-builder/configuring-fields-content-type.md#regular-fields)).
|
| Content Manager |
Addition of new *Locales* filter in collection types list view, to manage entries per locale (see [Introduction to the Content Manager](/user-docs/latest/content-manager/introduction-to-content-manager.md#collection-types)).
Addition of new options in content-types edit view, to translate content and manage it per locale (see [Translating content](/user-docs/latest/content-manager/translating-content.md)).
|
@@ -39,17 +39,17 @@ The Internationalization plugin impacts several parts of the admin panel. The ta
The Users & Permissions plugin is installed by default on all v4 Strapi applications, but can be deactivated.
-This plugin allows to manage end-users, who consume the content that is created and managed with a Strapi application and displayed on a front-end application (e.g. website, mobile application, connected device etc.). With the Users & Permissions plugin, it is possible to:
+This plugin allows to manage end users, who consume the content that is created and managed with a Strapi application and displayed on a front-end application (e.g. website, mobile application, connected device etc.). With the Users & Permissions plugin, it is possible to:
-- manage end-users accounts, based on a "User" collection type available through the plugin,
-- define the available end-users roles and their related permissions,
-- manage available providers to enable end-users to login through third-party providers,
-- configure available email templates aimed at the end-users (e.g. password reset, email address confirmation).
+- manage end users accounts, based on a "User" collection type available through the plugin,
+- define the available end-user roles and their related permissions,
+- manage available providers to enable end users to login through third-party providers,
+- configure available email templates aimed at the end users (e.g. password reset, email address confirmation).
The Users & Permissions plugin impacts several parts of the admin panel. The table below lists all the additional options and settings that are added to a Strapi application once the plugin has been installed.
| Section impacted | Options and settings |
|------------------|---------------------------------------------------------------------------------------------------------|
-| Settings |
Addition of a "Users & Permissions plugin" setting section, which contains 4 sub-sections: Roles (see [Configuring end-users roles](../users-roles-permissions/configuring-end-users-roles.md)), Providers, Email Templates, and Advanced Settings (see [Configuring Users & Permissions plugin](../settings/configuring-users-permissions-plugin-settings.md)). 👉 Path reminder:  *Settings > Users & Permissions plugin*
|
-| Content-Type Builder |
Creation of 3 default collection types: "User", "Role" and "Permission". They respectively allow to manage the end-users, the end-users roles and their permissions. These collection types cannot be deleted and their composing fields cannot be edited, but addition of new fields is possible. Out of the 3, only the "User" collection type is then available via the Content Manager.
|
-| Content Manager |
Addition of the default "User" collection type that allows to manage end-user accounts (see [Managing end-users accounts](../users-roles-permissions/managing-end-users.md)).
By default, the following fields are available: Username, Email, Password, as well as Confirmed and Blocked as boolean fields.
The "User" collection type has a relation established with the "Role" collection type. All end-user accounts must indeed be attributed a role: by default, the end-user is attributed the end-user role set as default, but that role can be changed via the end-users entries directly in the Content Manager.
|
\ No newline at end of file
+| Settings |
Addition of a "Users & Permissions plugin" setting section, which contains 4 sub-sections: Roles (see [Configuring end-user roles](../users-roles-permissions/configuring-end-users-roles.md)), Providers, Email Templates, and Advanced Settings (see [Configuring Users & Permissions plugin](../settings/configuring-users-permissions-plugin-settings.md)). 👉 Path reminder:  *Settings > Users & Permissions plugin*
|
+| Content-type Builder |
Creation of 3 default collection types: "User", "Role" and "Permission". They respectively allow to manage the end users, the end-user roles and their permissions. These collection types cannot be deleted and their composing fields cannot be edited, but addition of new fields is possible. Out of the 3, only the "User" collection type is then available via the Content Manager.
|
+| Content Manager |
Addition of the default "User" collection type that allows to manage end-user accounts (see [Managing end-user accounts](../users-roles-permissions/managing-end-users.md)).
By default, the following fields are available: Username, Email, Password, as well as Confirmed and Blocked as boolean fields.
The "User" collection type has a relation established with the "Role" collection type. All end-user accounts must indeed be attributed a role: by default, the end user is attributed the end-user role set as default, but that role can be changed via the end-user entries directly in the Content Manager.
|
\ No newline at end of file
diff --git a/docs/user-docs/latest/settings/configuring-users-permissions-plugin-settings.md b/docs/user-docs/latest/settings/configuring-users-permissions-plugin-settings.md
index 9ed4c698e1..2c87400703 100644
--- a/docs/user-docs/latest/settings/configuring-users-permissions-plugin-settings.md
+++ b/docs/user-docs/latest/settings/configuring-users-permissions-plugin-settings.md
@@ -6,11 +6,11 @@ canonicalUrl: https://docs.strapi.io/user-docs/latest/settings/configuring-users
# Configuring Users & Permissions plugin settings
-The Users & Permissions plugin is managed from the *Users & Permissions plugin* settings section, accessible from  *Settings* in the main navigation of the admin panel. This settings section allows to configure the available providers, email templates and the advanced settings of the plugin. It also allows to define the end-users roles and their related permissions (see [Configuring end-users roles](../users-roles-permissions/configuring-end-users-roles.md)).
+The Users & Permissions plugin is managed from the *Users & Permissions plugin* settings section, accessible from  *Settings* in the main navigation of the admin panel. This settings section allows to configure the available providers, email templates and the advanced settings of the plugin. It also allows to define the end-users roles and their related permissions (see [Configuring end-user roles](../users-roles-permissions/configuring-end-users-roles.md)).
## Configuring providers
-The Users & Permissions plugin allows to enable and configure providers, for end-users to login via a third-party provider to access the content of a font-end application through the Strapi application API. By default, a list of providers is available including one, "Email", enabled by default for all Strapi applications with the Users & Permissions plugin installed.
+The Users & Permissions plugin allows to enable and configure providers, for end users to login via a third-party provider to access the content of a font-end application through the Strapi application API. By default, a list of providers is available including one, "Email", enabled by default for all Strapi applications with the Users & Permissions plugin installed.

@@ -34,7 +34,7 @@ Click the search button  above the tab
## Configuring email templates
-The Users & Permissions plugin uses 2 email templates, "Email address confirmation" and "Reset password", that are sent to end-users:
+The Users & Permissions plugin uses 2 email templates, "Email address confirmation" and "Reset password", that are sent to end users:
- if their account must be confirmed to be activated,
- if they need to reset the password of their Strapi account.
@@ -51,7 +51,7 @@ To configure and edit email templates:
| -------------- | -------------------------------------------------------------------------------------------------|
| Shipper name | Indicate the name of the shipper of the email. |
| Shipper email | Indicate the email address of the shipper of the email. |
-| Response email | (optional) Indicate the email address to which responses emails from the end-users will be sent. |
+| Response email | (optional) Indicate the email address to which responses emails from the end users will be sent. |
| Subject | Write the subject of the email. Variables can be used (see [Developer documentation](https://strapi.io/documentation/developer-docs/latest/development/plugins/users-permissions.html#templating-emails)). |
4. Edit the content of the email in the "Message" textbox. Email templates content is in HTML and uses variables (see [Developer documentation](https://strapi.io/documentation/developer-docs/latest/development/plugins/users-permissions.html#templating-emails)).
@@ -59,7 +59,7 @@ To configure and edit email templates:
## Configuring advanced settings
-All settings related to the Users & Permissions plugin are managed from the *Advanced Settings* sub-section, including the choice of a default role for end-users, the enablement of sign-ups and email confirmation, as well as the choice of landing page for resetting a password.
+All settings related to the Users & Permissions plugin are managed from the *Advanced Settings* sub-section, including the choice of a default role for end users, the enablement of sign-ups and email confirmation, as well as the choice of landing page for resetting a password.

@@ -68,11 +68,11 @@ All settings related to the Users & Permissions plugin are managed from the *Adv
| Setting name | Instructions |
| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Default role for authenticated users | Click the drop-down list to choose the default role for new end-users. |
-| One account per email address | Click on the **ON** button to limit to 1 the number of end-user accounts with the same email address. Click on **OFF** to disable this limitation and allow several end-users accounts to be associated with the same email addess (e.g. `kai.doe@strapi.io` can be used when logging in via several different providers). |
-| Enable sign-ups | Click on the **ON** button to enable end-users sign-ups. Click on **OFF** to prevent end-users registration to your front-end application(s). |
+| Default role for authenticated users | Click the drop-down list to choose the default role for new end users. |
+| One account per email address | Click on the **ON** button to limit to 1 the number of end-user accounts with the same email address. Click on **OFF** to disable this limitation and allow several end-user accounts to be associated with the same email addess (e.g. `kai.doe@strapi.io` can be used when logging in via several different providers). |
+| Enable sign-ups | Click on the **ON** button to enable end-user sign-ups. Click on **OFF** to prevent end-user registration to your front-end application(s). |
| Reset password page | Indicate the URL of the reset password page for your front-end application(s). |
-| Enable email confirmation | Click on the **ON** button to enable end-users account confirmation by sending them a confirmation email. Click on **OFF** to disable account confirmation. |
-| Redirection url | Indicate the URL of the page where end-users should be redirected after confirming their Strapi account. |
+| Enable email confirmation | Click on the **ON** button to enable end-user account confirmation by sending them a confirmation email. Click on **OFF** to disable account confirmation. |
+| Redirection url | Indicate the URL of the page where end users should be redirected after confirming their Strapi account. |
3. Click the **Save** button.
\ No newline at end of file
diff --git a/docs/user-docs/latest/settings/managing-global-settings.md b/docs/user-docs/latest/settings/managing-global-settings.md
index 64ac31628e..c9c5e1ba1e 100644
--- a/docs/user-docs/latest/settings/managing-global-settings.md
+++ b/docs/user-docs/latest/settings/managing-global-settings.md
@@ -44,7 +44,7 @@ For each locale, the table displays the default ISO code of the locale, its opti
Administrators can add and manage as many locales as they want. There can however only be one locale set as the default one for the whole Strapi application.
::: note
-It is not possible to create custom locales. Locales can only be created based on [the 500+ pre-created list of locales](https://github.com/strapi/strapi/blob/releases/v4/packages/plugins/i18n/server/constants/iso-locales.json) set by Strapi.
+It is not possible to create custom locales. Locales can only be created based on [the 500+ pre-created list of locales](https://github.com/strapi/strapi/blob/v4.0.0/packages/plugins/i18n/server/constants/iso-locales.json) set by Strapi.
:::
To add a new locale:
diff --git a/docs/user-docs/latest/users-roles-permissions/configuring-administrator-roles.md b/docs/user-docs/latest/users-roles-permissions/configuring-administrator-roles.md
index bc237852c6..d2f6b767d1 100644
--- a/docs/user-docs/latest/users-roles-permissions/configuring-administrator-roles.md
+++ b/docs/user-docs/latest/users-roles-permissions/configuring-administrator-roles.md
@@ -6,7 +6,7 @@ canonicalUrl: https://docs.strapi.io/user-docs/latest/users-roles-permissions/co
# Configuring administrator roles
-Administrators are the users of an admin panel of a Strapi application. Administrator accounts and roles are managed with the Role-Based Access Control (RBAC) feature. It is available in the *Administration panel* section of the  _Settings_ subnavigation.
+Administrators are the users of an admin panel of a Strapi application. Administrator accounts and roles are managed with the Role-Based Access Control (RBAC) feature. It is available in the *Administration panel* section of the  _Settings_ sub navigation.
The *Administration panel* section is divided into 2 sub-sections: *Roles* and *Users* (see [Managing administrators](managing-administrators.md)).
@@ -30,7 +30,7 @@ By default, 3 administrator roles are defined for any Strapi application:
If you use your Strapi application with the Community Edition (see [Pricing and Plans](https://strapi.io/pricing-self-hosted)), your use of the RBAC feature will be limited. Only the 3 default roles are available, as you cannot create more roles and cannot delete the default ones. It is however possible to edit them, but to an extent:
- You can only configure permissions for the content-types, but not for the plugins and settings of the Strapi application.
-- Configuring permissions in detail is only available for the Enterprise Edition. With the Community Edition, although you can choose which fields of a content type are accessible, these fields are automatically fully accessible with all permissions.
+- Configuring permissions in detail is only available for the Enterprise Edition. With the Community Edition, although you can choose which fields of a content-type are accessible, these fields are automatically fully accessible with all permissions.
- Custom conditions defined for a specific permission are also only available for the Enterprise Edition.
:::
@@ -86,15 +86,15 @@ The permissions area of an administrator role editing interface allows to config
#### Collection and Single types
-The Collection types and Single types categories respectively list all available collection and single types for the Strapi application. For each content type, the administrators can have the permission to perform the following actions: create, read, update, delete and publish.
+The Collection types and Single types categories respectively list all available collection and single types for the Strapi application. For each content-type, the administrators can have the permission to perform the following actions: create, read, update, delete and publish.
To configure Collection or Single types permissions for a role:
1. Go to the Collection types or Single types category of the permissions table.
-2. Tick the box on the left of the name of the content type to give access to. By default, all actions can be performed for all fields of the content type.
+2. Tick the box on the left of the name of the content-type to give access to. By default, all actions can be performed for all fields of the content-type.
3. (optional - Enterprise Edition only) Untick the action-related boxes to prevent actions of your choice.
-4. (optional) Click the name of the content type to display its full list of fields. Untick the field and action-related boxes to prevent access and/or action for the fields of your choice. If the [Internationalization plugin](/user-docs/latest/plugins/strapi-plugins.md#internationalization-plugin) is installed, define also what permissions should be granted for each available locale.
-5. Repeat steps 2 to 4 for each content type available to which the role should give access.
+4. (optional) Click the name of the content-type to display its full list of fields. Untick the field and action-related boxes to prevent access and/or action for the fields of your choice. If the [Internationalization plugin](/user-docs/latest/plugins/strapi-plugins.md#internationalization-plugin) is installed, define also what permissions should be granted for each available locale.
+5. Repeat steps 2 to 4 for each content-type available to which the role should give access.
6. Click on the **Save** button on the top right corner.
#### Plugins and Settings
@@ -111,12 +111,12 @@ To configure plugins or settings permissions for a role:
::: tab Plugins
-By default, plugins permissions can be configured for the Content-Type Builder, the Upload (i.e. Media Library) plugin, the Content Manager, and Users Permissions (i.e. the Users & Permissions plugin allowing to manage end-users). Each plugin has its own specific set of permissions.
+By default, plugins permissions can be configured for the Content-type Builder, the Upload (i.e. Media Library) plugin, the Content Manager, and Users Permissions (i.e. the Users & Permissions plugin allowing to manage end users). Each plugin has its own specific set of permissions.
| Plugin name | Permissions |
| -------------------- | ----------- |
| Content-Manager |
Single types
"Configure view" - allows to configure the edit view of a single type
Collection types
"Configure view" - allows to configure the edit view of a collection type
Components
"Configure Layout" - allows to configure the layout of a component
|
-| Content-Type-Builder |
General
"Read" - gives access to the Content-Type Builder plugin in read-only mode
|
+| Content-Type-Builder |
General
"Read" - gives access to the Content-type Builder plugin in read-only mode
|
| Upload *(Media Library)* |
General
"Access the Media Library" - gives access to the Media Library plugin
Assets
"Create (upload)" - allows to upload media files
"Update (crop, details, replace) + delete" - allows to edit uploaded media files
"Download" - allows to download uploaded media files
"Copy link" - allows to copy the link of an uploaded media file
|
| Users-Permissions |
Roles
"Create" - allows to create end-user roles
"Read" - allows to see created end-user roles
"Update" - allows to edit end-user roles
"Delete" - allows to delete end-user roles
Providers
"Read" - allows to see providers
"Edit" - allows to edit providers
Email Templates
"Read" - allows to access the email templates
"Edit" - allows to edit email templates
Advanced settings
"Read" - allows to access the advanced settings of the Users & Permissions plugin
"Edit" - allows to edit advanced settings
👉 Path reminder to the Users & Permissions plugin: *General > Settings > Users & Permissions plugin* |
diff --git a/docs/user-docs/latest/users-roles-permissions/configuring-end-users-roles.md b/docs/user-docs/latest/users-roles-permissions/configuring-end-users-roles.md
index 10e981c121..eab9db42a0 100644
--- a/docs/user-docs/latest/users-roles-permissions/configuring-end-users-roles.md
+++ b/docs/user-docs/latest/users-roles-permissions/configuring-end-users-roles.md
@@ -1,20 +1,20 @@
---
title: Configure End-users Roles - Strapi User Guide
-description: Instructions to configure the end-users roles for a front-end application using the Users & Permissions plugin
+description: Instructions to configure the end-user roles for a front-end application using the Users & Permissions plugin
canonicalUrl: https://docs.strapi.io/user-docs/latest/users-roles-permissions/configuring-end-users-roles.html
---
-# Configuring end-users roles
+# Configuring end-user roles
End-users are the users who consume the content that is created and managed with a Strapi application and displayed on front-end applications (e.g. websites, mobile applications, connected devices etc.). Unlike the administrators, they do not have access to the admin panel.
-With the [Users & Permissions plugin](../plugins/strapi-plugins.md#users-permissions-plugin) activated, it is possible to manage end-users. This plugin is however not entirely managed and configured from one same place of the admin panel: end-users accounts are managed from the Content Manager (see [Managing end-user accounts](../users-roles-permissions/managing-end-users.md)) but end-users roles and permissions are managed in the Settings interface.
+With the [Users & Permissions plugin](../plugins/strapi-plugins.md#users-permissions-plugin) activated, it is possible to manage end users. This plugin is however not entirely managed and configured from one same place of the admin panel: end-user accounts are managed from the Content Manager (see [Managing end-user accounts](../users-roles-permissions/managing-end-users.md)) but end-user roles and permissions are managed in the Settings interface.
-The configurations of the end-users roles and permissions are available in the *Users & Permissions plugin* section of the  _Settings_ subnavigation.
+The configurations of the end-user roles and permissions are available in the *Users & Permissions plugin* section of the  _Settings_ sub navigation.

-The *Roles* sub-section of *Users & Permissions plugin* displays all created roles for the end-users of your Strapi application.
+The *Roles* sub-section of *Users & Permissions plugin* displays all created roles for the end users of your Strapi application.
From this interface, it is possible to:
@@ -28,23 +28,23 @@ Click the search button  above the tab
By default, 2 end-user roles are defined for any Strapi application:
-- Authenticated: for end-users to access content only if they are logged in to a front-end application.
-- Public: for end-users to access content without being logged in to a front-end application.
+- Authenticated: for end users to access content only if they are logged in to a front-end application.
+- Public: for end users to access content without being logged in to a front-end application.
::: note
-The end-user role attributed by default to all new end-users can be defined in the *Advanced settings* sub-section of *Users & Permissions plugin* (see [Configuring advanced settings](../settings/configuring-users-permissions-plugin-settings.md#configuring-advanced-settings)).
+The end-user role attributed by default to all new end users can be defined in the *Advanced settings* sub-section of *Users & Permissions plugin* (see [Configuring advanced settings](../settings/configuring-users-permissions-plugin-settings.md#configuring-advanced-settings)).
:::
## Creating a new role
-On the top right side of the *Users & Permissions plugin > Roles* interface, an **Add new role** button is displayed. It allows to create a new role for end-users of your Strapi application.
+On the top right side of the *Users & Permissions plugin > Roles* interface, an **Add new role** button is displayed. It allows to create a new role for end users of your Strapi application.
To create a new role, click on the **Add new role** button.
Clicking on the **Add new role** button will redirect you to the roles edition interface, where you will be able to edit the role's details and configure its permissions (see [Editing a role](#editing-role-s-details)).
## Deleting a role
-Although the 2 default end-users roles cannot be deleted, the other ones can, as long as no end-user still has this role attributed to their account.
+Although the 2 default end-user roles cannot be deleted, the other ones can, as long as no end user still has this role attributed to their account.
To delete a role:
@@ -53,7 +53,7 @@ To delete a role:
## Editing a role
-
+
The role edition interface allows to edit the details of an end-user role as well as to configure in detail the permissions to access the content of a front-end application. It is accessible from *Users & Permissions plugin > Roles* either after clicking on the edit button  on the right side of a role's record, or after clicking on the **Add new role** button (see [Creating a new role](#creating-a-new-role)).
diff --git a/docs/user-docs/latest/users-roles-permissions/introduction-to-users-roles-permissions.md b/docs/user-docs/latest/users-roles-permissions/introduction-to-users-roles-permissions.md
index bc2d8bce2a..8df4386a51 100644
--- a/docs/user-docs/latest/users-roles-permissions/introduction-to-users-roles-permissions.md
+++ b/docs/user-docs/latest/users-roles-permissions/introduction-to-users-roles-permissions.md
@@ -6,7 +6,7 @@ canonicalUrl: https://docs.strapi.io/user-docs/latest/users-roles-permissions/in
# Introduction to users, roles & permissions
-Some features of the admin panel, as well as the content managed with Strapi itself, are ruled by a system of permissions. These permissions can be assigned to roles, which are associated with the users who have access to the admin panel, the administrators. But it is also possible to grant permissions more publicly, to give access to content to the end-users of your Strapi application.
+Some features of the admin panel, as well as the content managed with Strapi itself, are ruled by a system of permissions. These permissions can be assigned to roles, which are associated with the users who have access to the admin panel, the administrators. But it is also possible to grant permissions more publicly, to give access to content to the end users of your Strapi application.
Depending on what users and their roles and permissions you want to manage, you should either use the Role Based Access Control (RBAC) feature, or the Users & Permissions plugin. Both are managed from  _Settings_, accessible from the main navigation of the admin panel.
diff --git a/docs/user-docs/latest/users-roles-permissions/managing-administrators.md b/docs/user-docs/latest/users-roles-permissions/managing-administrators.md
index 5f697adc64..ebea945d3e 100644
--- a/docs/user-docs/latest/users-roles-permissions/managing-administrators.md
+++ b/docs/user-docs/latest/users-roles-permissions/managing-administrators.md
@@ -6,7 +6,7 @@ canonicalUrl: https://docs.strapi.io/user-docs/latest/users-roles-permissions/ma
# Managing administrator accounts
-Administrators are the users of an admin panel of a Strapi application. Administrator accounts and roles are managed with the Role-Based Access Control (RBAC) feature. It is available in the *Administration panel* section of the section of the  _Settings_ subnavigation.
+Administrators are the users of an admin panel of a Strapi application. Administrator accounts and roles are managed with the Role-Based Access Control (RBAC) feature. It is available in the *Administration panel* section of the section of the  _Settings_ sub navigation.
The *Administration panel* section is divided into 2 sub-sections: *Roles* (see [Configuring administrator roles](configuring-administrator-roles.md)) and *Users*.
diff --git a/docs/user-docs/latest/users-roles-permissions/managing-end-users.md b/docs/user-docs/latest/users-roles-permissions/managing-end-users.md
index f99d83b7ac..ae96440545 100644
--- a/docs/user-docs/latest/users-roles-permissions/managing-end-users.md
+++ b/docs/user-docs/latest/users-roles-permissions/managing-end-users.md
@@ -4,20 +4,20 @@ description: Instructions to manage the end-users of a front-end application wit
canonicalUrl: https://docs.strapi.io/user-docs/latest/users-roles-permissions/managing-end-users.html
---
-# Managing end-users accounts
+# Managing end-user accounts
End-users are the users who consume the content that is created and managed with a Strapi application and displayed on front-end applications (e.g. websites, mobile applications, connected devices etc.). Unlike the administrators, they do not have access to the admin panel.
-With the [Users & Permissions plugin](../plugins/strapi-plugins.md#users-permissions-plugin) activated, it is possible to manage end-users. This plugin is however not entirely managed and configured from one same place of the admin panel: end-users roles and permissions are managed in the  _Settings_ interface (see [Configuring end-users roles](../users-roles-permissions/configuring-end-users-roles.md)), but end-users accounts are managed from the  _Content Manager_.
+With the [Users & Permissions plugin](../plugins/strapi-plugins.md#users-permissions-plugin) activated, it is possible to manage end users. This plugin is however not entirely managed and configured from one same place of the admin panel: end-user roles and permissions are managed in the  _Settings_ interface (see [Configuring end-user roles](../users-roles-permissions/configuring-end-users-roles.md)), but end-user accounts are managed from the  _Content Manager_.
-With the Users & Permissions plugin, the end-users and their account information are managed as a content-type. When the plugin is installed on a Strapi application, 3 collection types are automatically created (see [Users & Permissions plugin](../plugins/strapi-plugins.md#users-permissions-plugin)), including "User" which is the only one available directly in the Content Manager.
+With the Users & Permissions plugin, the end users and their account information are managed as a content-type. When the plugin is installed on a Strapi application, 3 collection types are automatically created (see [Users & Permissions plugin](../plugins/strapi-plugins.md#users-permissions-plugin)), including "User" which is the only one available directly in the Content Manager.
-
+
-Registering new end-users in a front-end application with the Users & Permissions plugin consists in adding a new entry to the User collection-type (see [Introduction to the Content Mananger](../content-manager/introduction-to-content-manager.md) for more information about the Content Manager).
+Registering new end users in a front-end application with the Users & Permissions plugin consists in adding a new entry to the User collection type (see [Introduction to the Content Mananger](../content-manager/introduction-to-content-manager.md) for more information about the Content Manager).
::: note
-If end-users can register themselves on your front-end application (see [Managing Users & Permissions plugin settings](../settings/configuring-users-permissions-plugin-settings.md)), a new entry will automatically be created and the fields of that entry will be filled up with the information indicated by the end-user. All fields can however be edited by an administrator of the Strapi application.
+If end users can register themselves on your front-end application (see [Managing Users & Permissions plugin settings](../settings/configuring-users-permissions-plugin-settings.md)), a new entry will automatically be created and the fields of that entry will be filled up with the information indicated by the end user. All fields can however be edited by an administrator of the Strapi application.
:::
To create a new end-user account:
@@ -28,11 +28,11 @@ To create a new end-user account:
| Field | Instructions |
| --------- | ----------------------------------------------------------------------------------------------------------- |
-| Username | Write the username of the end-user. |
-| Email | Write the complete email address of the end-user in the textbox. |
+| Username | Write the username of the end user. |
+| Email | Write the complete email address of the end user in the textbox. |
| Password | (optional) Write a new password in the textbox. You can click on the eye icon for the password to be shown. |
| Confirmed | (optional) Click **ON** for the end-user account to be confirmed. |
-| Blocked | (optional) Click **ON** to block the account of the end-user, to prevent them to access content. |
+| Blocked | (optional) Click **ON** to block the account of the end user, to prevent them to access content. |
-4. In the Relation box, indicate the role that should be granted to the new end-user. If this step is skipped, the end-user will be attributed the role set as default (see [Managing Users & Permissions plugin settings](../settings/configuring-users-permissions-plugin-settings.md)).
+4. In the Relation box, indicate the role that should be granted to the new end user. If this step is skipped, the end user will be attributed the role set as default (see [Managing Users & Permissions plugin settings](../settings/configuring-users-permissions-plugin-settings.md)).
5. Click on the **Save** button.