From 437b6663fd240e8edde12c90cf394ba9531fabe9 Mon Sep 17 00:00:00 2001 From: Pierre Wizla Date: Tue, 19 Dec 2023 12:06:32 +0100 Subject: [PATCH] Rework and expand Plugins Development section (#1922) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Rework plugin creation and setup page * Clean up intro * Add WIP plugin structure docs * Add marketplace guide * Fix TOC and next nav item * Improve the create a plugin page further * Fix the plugin structure files * Improve the plugin structure section * Refine wordings and improve the journey * Fix comment wording in plugin structure * Fine-tune the Admin Panel and Server API docs * Fine-tune the plugin creation and structure docs * Add guide to store and access data from a plugin * WIP guides * Fix breadcrumbs * Improve intro * Revert "Fix breadcrumbs" This reverts commit 94124cc57fd8043d9e6e3d067584a4ef6ddfe7e9. * Add "pass data" guide * Add external resources section * Fix broken link * Convert "external resources" section to a callout * Improve plugin middlewares example * Improve lifecycle functions documentation * Tweak links to Marketplace * Remove unused guides links and add additional resources * Add missing description SEO tags * Fix blog link * Clean up TOC to remove duplicates * Remove Custom Fields from Dev as it's in Plugins * Display h4s in secondary nav. * Explain top-level vs. global getters * Replace "boilerplate" with more accurate descriptions * Explain hot reloading * Remove a completed to-do * Slightly format table * Break down a sentence that was too long * Fix bad component naming Tab β†’ TabItem --- .../dev-docs/api/plugins/admin-panel-api.md | 24 +- .../docs/dev-docs/api/plugins/server-api.md | 91 +++-- .../docs/dev-docs/configurations/functions.md | 20 ++ .../dev-docs/plugins/developing-plugins.md | 80 ++--- .../plugins/development/create-a-plugin.md | 314 ++++++++++++++++++ .../plugins/development/plugin-structure.md | 39 +++ .../dev-docs/plugins/guides/marketplace.md | 203 +++++++++++ .../guides/pass-data-from-server-to-admin.md | 101 ++++++ .../plugins/guides/store-and-access-data.md | 176 ++++++++++ docusaurus/sidebars.js | 30 +- docusaurus/src/components/PluginStructure.js | 131 ++++++++ .../ReusableAnnotationComponents.jsx | 36 ++ docusaurus/src/theme/MDXComponents.js | 6 + .../generate-plugin-content-type.png | Bin 0 -> 74136 bytes 14 files changed, 1132 insertions(+), 119 deletions(-) create mode 100644 docusaurus/docs/dev-docs/plugins/development/create-a-plugin.md create mode 100644 docusaurus/docs/dev-docs/plugins/development/plugin-structure.md create mode 100644 docusaurus/docs/dev-docs/plugins/guides/marketplace.md create mode 100644 docusaurus/docs/dev-docs/plugins/guides/pass-data-from-server-to-admin.md create mode 100644 docusaurus/docs/dev-docs/plugins/guides/store-and-access-data.md create mode 100644 docusaurus/src/components/PluginStructure.js create mode 100644 docusaurus/src/components/ReusableAnnotationComponents/ReusableAnnotationComponents.jsx create mode 100644 docusaurus/static/img/assets/development/generate-plugin-content-type.png diff --git a/docusaurus/docs/dev-docs/api/plugins/admin-panel-api.md b/docusaurus/docs/dev-docs/api/plugins/admin-panel-api.md index 8525705888..d594e0e529 100644 --- a/docusaurus/docs/dev-docs/api/plugins/admin-panel-api.md +++ b/docusaurus/docs/dev-docs/api/plugins/admin-panel-api.md @@ -1,26 +1,28 @@ --- sidebar_label: Admin Panel API -pagination_prev: dev-docs/plugins/developing-plugins +pagination_prev: dev-docs/plugins/development/plugin-structure +toc_max_heading_level: 4 --- # Admin Panel API for plugins -A Strapi [plugin](/dev-docs/plugins) can interact with both the [back end](/dev-docs/api/plugins/server-api) or the front end of the Strapi app. The Admin Panel API is about the front end part, i.e. it allows a plugin to customize Strapi's [admin panel](/user-docs/intro). +A Strapi [plugin](/dev-docs/plugins) can interact with both the [back end](/dev-docs/api/plugins/server-api) and the front end of a Strapi application. The Admin Panel API is about the front end part, i.e. it allows a plugin to customize Strapi's [admin panel](/user-docs/intro). The admin panel is a [React](https://reactjs.org/) application that can embed other React applications. These other React applications are the admin parts of each Strapi plugin. -To create a plugin that interacts with the Admin Panel API: - -1. Create an [entry file](#entry-file). -2. Within this file, declare and export a plugin interface that uses the [available actions](#available-actions). -3. Require this plugin interface in a `strapi-admin.js` file at the root of the plugin package folder: +:::prerequisites +You have [created a Strapi plugin](/dev-docs/plugins/development/create-a-plugin). +::: - ```js title="[plugin-name]/strapi-admin.js" +The Admin Panel API includes: - 'use strict'; +- an [entry file](#entry-file) which exports the required interface, +- [lifecycle functions](#lifecycle-functions) and the `registerTrad()` [async function](#async-function), +- and several [specific APIs](#available-actions) for your plugin to interact with the admin panel. - module.exports = require('./admin/src').default; - ``` +:::note +The whole code for the admin panel part of your plugin could live in the `/strapi-admin.js|ts` or `/admin/src/index.js|ts` file. However, it's recommended to split the code into different folders, just like the [structure](/dev-docs/plugins/development/plugin-structure) created by the `strapi generate plugin` CLI generator command. +::: ## Entry file diff --git a/docusaurus/docs/dev-docs/api/plugins/server-api.md b/docusaurus/docs/dev-docs/api/plugins/server-api.md index 37cbabebb1..0b02aaf45e 100644 --- a/docusaurus/docs/dev-docs/api/plugins/server-api.md +++ b/docusaurus/docs/dev-docs/api/plugins/server-api.md @@ -3,18 +3,29 @@ title: Server API for plugins sidebar_label: Server API displayed_sidebar: devDocsSidebar description: Strapi's Server API for plugins allows a Strapi plugin to customize the back end part (i.e. the server) of your application. -sidebarDepth: 3 - --- # Server API for plugins -A Strapi [plugin](/dev-docs/plugins) can interact with the backend or the [frontend](/dev-docs/api/plugins/admin-panel-api) of the Strapi application. The Server API is about the backend part. +A Strapi [plugin](/dev-docs/plugins) can interact with both the back end and the [front end](/dev-docs/api/plugins/admin-panel-api) of a Strapi application. The Server API is about the back-end part, i.e. how the plugin interacts with the server part of a Strapi application. + +:::prerequisites +You have [created a Strapi plugin](/dev-docs/plugins/development/create-a-plugin). +::: + +The Server API includes: + +- an [entry file](#entry-file) which export the required interface, +- [lifecycle functions](#lifecycle-functions), +- a [configuration](#configuration) API, +- the ability to add [cron](#cron) jobs, +- and the ability to [customize all elements of the back-end server](#backend-customization). -Creating and using a plugin interacting with the Server API consists of 2 steps: +Once you have declared and exported the plugin interface, you will be able to [use the plugin interface](#usage). -1. Declare and export the plugin interface within the [`strapi-server.js` entry file](#entry-file) -2. [Use the exported interface](#usage) +:::note +The whole code for the server part of your plugin could live in the `/strapi-server.js|ts` or `/server/index.js|ts` file. However, it's recommended to split the code into different folders, just like the [structure](/dev-docs/plugins/development/plugin-structure) created by the `strapi generate plugin` CLI generator command. +::: ## Entry file @@ -81,7 +92,7 @@ module.exports = () => ({ ## Configuration -`config` stores the default plugin configuration. +`config` stores the default plugin configuration. It loads and validates the configuration inputted from the user within the [`./config/plugins.js` configuration file](/dev-docs/configurations/plugins). **Type**: `Object` @@ -113,6 +124,10 @@ Once defined, the configuration can be accessed: - with `strapi.plugin('plugin-name').config('some-key')` for a specific configuration property, - or with `strapi.config.get('plugin.plugin-name')` for the whole configuration object. +:::tip +Run `yarn strapi console` or `npm run strapi console` to access the strapi object in a live console. +::: + ## Cron The `cron` object allows you to add cron jobs to the Strapi instance. @@ -155,6 +170,12 @@ strapi.cron.jobs ## Backend customization +All elements of the back-end server of Strapi can be customized through a plugin using the Server API. + +:::prerequisites +To better understand this section, ensure you have read through the [back-end customization](/dev-docs/backend-customization) documentation of a Strapi application. +::: + ### Content-types An object with the [content-types](/dev-docs/backend-customization/models) the plugin provides. @@ -461,50 +482,54 @@ An object with the [middlewares](/dev-docs/configurations/middlewares) the plugi **Example:** -```js title="./src/plugins/my-plugin/strapi-server.js" - -"use strict"; - -module.exports = require('./server'); -``` +```js title="./src/plugins/my-plugin/server/middlewares/your-middleware.js" -```js title="./src/plugins/my-plugin/server/index.js" - -const middlewares = require('./middlewares'); -module.exports = () => ({ - middlewares, -}); +/** + * The your-middleware.js file + * declares a basic middleware function and exports it. + */ +'use strict'; +module.exports = async (ctx, next) => { + console.log("your custom logic") + await next(); +} ``` ```js title="./src/plugins/my-plugin/server/middlewares/index.js" -const middlewareA = require('./middleware-a'); -const middlewareB = require('./middleware-b'); +/** + * The middleware function previously created + * is imported from its file and + * exported by the middlewares index. + */ +'use strict'; +const yourMiddleware = require('./your-middleware'); module.exports = { - middlewareA, - middlewareB, + yourMiddleware }; ``` -```js title="./src/plugins/my-plugin/server/middlewares/middleware-a.js" +```js title="./src/plugins/my-plugin/server/register.js" -module.exports = (options, { strapi }) => { - return async (ctx, next) => { - const start = Date.now(); - await next(); - const delta = Math.ceil(Date.now() - start); +/** + * The middleware is called from + * the plugin's register lifecycle function. + */ +'use strict'; +const middlewares = require('./middlewares'); - strapi.log.http(`${ctx.method} ${ctx.url} (${delta} ms) ${ctx.status}`); - }; +module.exports = ({ strapi }) => { + strapi.server.use(middlewares.yourMiddleware); }; ``` ## Usage -Once a plugin is exported and loaded into Strapi, its features are accessible in the code through getters. The Strapi instance (`strapi`) exposes top-level getters and global getters. +Once a plugin is exported and loaded into Strapi, its features are accessible in the code through getters. The Strapi instance (`strapi`) exposes both top-level getters and global getters: -While top-level getters imply chaining functions, global getters are syntactic sugar that allows direct access using a feature's uid: +- top-level getters imply chaining functions
(e.g., `strapi.plugin('the-plugin-name').controller('the-controller-name'`), +- global getters are syntactic sugar that allows direct access using a feature's uid
(e.g., `strapi.controller('plugin::plugin-name.controller-name')`). ```js // Access an API or a plugin controller using a top-level getter diff --git a/docusaurus/docs/dev-docs/configurations/functions.md b/docusaurus/docs/dev-docs/configurations/functions.md index 678b9f0a57..3931fbd6cc 100644 --- a/docusaurus/docs/dev-docs/configurations/functions.md +++ b/docusaurus/docs/dev-docs/configurations/functions.md @@ -11,6 +11,18 @@ The `./src/index.js` file (or `./src/index.ts` file in a [TypeScript-based](/dev The functions can be synchronous, asynchronous, or return a promise. +``` mermaid +flowchart TB + A([The Strapi application starts.]) --> B{"register()"} + B -- The Strapi application is setup. --> C + C{"bootstrap()"} -- The Strapi back-end server starts. --> D + D(Request) + D + click B "#register" + click C "#bootstrap" + click D "/dev-docs/backend-customization/requests-responses" +``` + ## Synchronous function @@ -147,6 +159,8 @@ It can be used to: - load some [environment variables](/dev-docs/configurations/environment) - register a [custom field](/dev-docs/custom-fields) that would be used only by the current Strapi application. +`register()` is the very first thing that happens when a Strapi application is starting. This happens _before_ any setup process and you don't have any access to database, routes, policies, or any other backend server elements within the `register()` function. + ## Bootstrap The `bootstrap` lifecycle function, found in `./src/index.js` (or in `./src/index.ts`), is called at every server start. @@ -157,6 +171,12 @@ It can be used to: - fill the database with some necessary data - declare custom conditions for the [Role-Based Access Control (RBAC)](/dev-docs/configurations/rbac) feature +The `bootstrapi()` function is run _before_ the back-end server starts but _after_ the Strapi application has setup, so you have access to anything from the `strapi` object. + +:::tip +You can run `yarn strapi console` (or `npm run strapi console`) in the terminal and interact with the `strapi` object. +::: + ## Destroy The `destroy` function, found in `./src/index.js` (or in `./src/index.ts`), is an asynchronous function that runs before the application gets shut down. diff --git a/docusaurus/docs/dev-docs/plugins/developing-plugins.md b/docusaurus/docs/dev-docs/plugins/developing-plugins.md index 1bae1c4d41..822166d003 100644 --- a/docusaurus/docs/dev-docs/plugins/developing-plugins.md +++ b/docusaurus/docs/dev-docs/plugins/developing-plugins.md @@ -1,9 +1,9 @@ --- title: Developing plugins -# description: todo +description: Generation introduction about Strapi plugins development displayed_sidebar: devDocsSidebar pagination_prev: dev-docs/plugins -pagination_next: dev-docs/api/plugins/admin-panel-api +pagination_next: dev-docs/plugins/development/create-a-plugin --- # Developing Strapi plugins @@ -12,76 +12,38 @@ pagination_next: dev-docs/api/plugins/admin-panel-api This section is about developing Strapi plugins to use them as local plugins or to submit them to the Marketplace. Not what you're looking for? Read the [plugins introduction](/dev-docs/plugins) and find your use case and recommended section to read from there. ::: -Strapi allows the development of plugins that work exactly like the built-in plugins or 3rd-party plugins available from the Marketplace. Once created, your plugin can be: +Strapi allows the development of plugins that work exactly like the built-in plugins or 3rd-party plugins available from the [Marketplace](https://market.strapi.io). Once created, your plugin can be: - used as a local plugin, working only with a specific Strapi project, -- or submitted to the [Marketplace](https://market.strapi.io) to be shared with the community. +- or [submitted to the Marketplace](https://market.strapi.io/submit-plugin) to be shared with the community. -The first step to developing a Strapi plugin is to create it using the CLI-based generator. Then you'll be able to leverage the [plugin APIs](#plugin-apis) to add features to your plugin. +πŸ‘‰ To start developing a Strapi plugin: -## Plugin creation - -Strapi provides a [command line interface (CLI)](/dev-docs/cli) for creating plugins. To create a plugin: - -1. Navigate to the root of a Strapi project. -2. Run `yarn strapi generate` or `npm run strapi generate` in a terminal window to start the interactive CLI. -3. Choose "plugin" from the list, press Enter, and give the plugin a name in kebab-case (e.g. `my-plugin`) -4. Choose either `JavaScript` or `TypeScript` for the plugin language. -5. Create a plugins configuration file if one does not already exist: `./config/plugins.js` or `./config/plugins.ts` for TypeScript projects. -6. Enable the plugin by adding it to the [plugins configurations](/dev-docs/configurations/plugins) file: - - - - -```js title="./config/plugins.js" -module.exports = { - // ... - "my-plugin": { - enabled: true, - resolve: "./src/plugins/my-plugin", // path to plugin folder - }, - // ... -}; -``` - - - - - -```js title=./config/plugins.ts -export default { - // ... - "my-plugin": { - enabled: true, - resolve: "./src/plugins/my-plugin", // path to plugin folder - }, - // ... -}; -``` - - - - -7. Run `npm install` or `yarn` in the newly-created plugin directory. -8. (_TypeScript-specific_) Run `yarn build` or `npm run build` in the plugin directory. This step transpiles the TypeScript files and outputs the JavaScript files to a `dist` directory that is unique to the plugin. -9. Run `yarn build` or `npm run build` at the project root. -10. Run `yarn develop` or `npm run develop` at the project root. - -Plugins created using the preceding directions are located in the `plugins` directory of the application (see [project structure](/dev-docs/project-structure)). - -:::note -During plugin development it is helpful to use the `--watch-admin` flag to toggle hot reloading of the admin panel. See the [Admin panel customization](/dev-docs/admin-panel-customization) documentation for more details. (TypeScript specific) While developing your plugin, you can run `yarn develop --watch-admin` or `npm run develop -- --watch-admin` in the plugin directory to watch the changes to the TypeScript server files. From 4.15.1 this is no longer required. -::: +1. [Create a plugin](/dev-docs/plugins/development/create-a-plugin) using the CLI-based generator. +2. Learn more about the [structure of a plugin](/dev-docs/plugins/development/plugin-structure). +3. Get an overview of the [plugin APIs](#plugin-apis) to add features to your plugin. +4. Read some [guides](#guides) based on your use case(s). ## Plugin APIs Strapi provides the following programmatic APIs for plugins to hook into some of Strapi's features: - + :::strapi Custom fields plugins Plugins can also be used to add [custom fields](/dev-docs/custom-fields) to Strapi. ::: + +## Guides + + + + +
+ +:::strapi Additional resources +The Strapi blog features a [tutorial series](https://strapi.io/blog/how-to-create-a-strapi-v4-plugin-server-customization-4-6) about creating a Strapi v4 'Todo' plugin. The [contributors documentation](https://contributor.strapi.io/) can also include additional information useful while developing a Strapi plugin. +::: diff --git a/docusaurus/docs/dev-docs/plugins/development/create-a-plugin.md b/docusaurus/docs/dev-docs/plugins/development/create-a-plugin.md new file mode 100644 index 0000000000..aab1c8efff --- /dev/null +++ b/docusaurus/docs/dev-docs/plugins/development/create-a-plugin.md @@ -0,0 +1,314 @@ +--- +title: Plugin creation & setup +description: Learn how to create a Strapi plugin and how to start the development servers +pagination_next: dev-docs/plugins/development/plugin-structure +--- + +# Plugin creation and setup + +To start developing a Strapi plugin, you need to: + +1. create the plugin, +2. enable the plugin, +3. install dependencies, build the admin panel, and start the server(s). + +:::prerequisites +You created a Strapi project. +
+Use the CLI to create a project: + +Run the corresponding command in a terminal window, replacing `my-project` with the name of your choice: + + + + + +```bash +yarn create strapi-app my-project --quickstart +``` + + + + + +```bash +npx create-strapi-app@latest my-project --quickstart +``` + + + + + +More details can be found in the [CLI installation guide](/dev-docs/installation/cli). +
+::: + +## Create the plugin using the CLI generator + +The fastest way to create a Strapi plugin is to use the CLI generator. To do so: + +1. Navigate to the root of an existing Strapi project, or create a new one. +2. Run the following command in a terminal window to start the interactive CLI: + + + + + ```sh + yarn strapi generate plugin + ``` + + + + + + ```sh + npm run strapi generate plugin + ``` + + + + +4. Choose either `JavaScript` or `TypeScript` for the plugin language. + +## Enable the plugin + +Once the `strapi generate plugin` CLI script has finished running, the minimum required code for the plugin to work is created for you, but the plugin is not enabled yet. + +To enable a plugin: + +1. If it does not exist already, create the **plugins configuration file** file at the root of the Strapi project. +2. Enable the plugin by adding the following code to the plugins configuration file: + + + + + ```js title="./config/plugins.js" + module.exports = { + // ... + "my-plugin": { // name of your plugin, kebab-cased + enabled: true, + resolve: "./src/plugins/my-plugin", // path to the plugin folder + }, + // ... + }; + ``` + + + + + + ```js title=./config/plugins.ts + export default { + // ... + "my-plugin": { + enabled: true, + resolve: "./src/plugins/my-plugin", // path to plugin folder + }, + // ... + }; + ``` + + + + +:::tip +If you plan to use the plugin outside the Strapi project it was created in, move your plugin file outside the Strapi project and change the `resolve` value to the absolute directory path of your plugin. +::: + +## Install dependencies, build the admin panel, and start servers + +Once the plugin code has been generated and the plugin is enabled, the next steps slighly differ depending on whether you created a vanilla JavaScript-based plugin or a TypeScript-based plugin (see [step 3](#create-the-plugin-using-the-cli-generator) of the CLI generator instructions). + + + + + +1. Navigate to the folder of the plugin.
If created from a Strapi project using the CLI generator, plugins are located in the `src/plugins` folder (see [project structure](/dev-docs/project-structure)). + +2. Run the following command in the newly-created plugin directory to install plugin dependencies: + + + + + ```sh + yarn + ``` + + + + + + ```sh + npm install + ``` + + + + +3. Navigate back to the Strapi project root with `cd ../../..` and run the following commands to build the admin panel and start the server(s): + + + + + ```sh + yarn build + yarn develop + ``` + + + + + + ```sh + npm run build + npm run develop + ``` + + + + +
+ + + +1. Navigate to the folder of the plugin.
If created from a Strapi project using the CLI generator, plugins are located in the `src/plugins` folder (see [project structure](/dev-docs/project-structure)). + +2. Run the following command in the newly-created plugin directory to install plugin dependencies: + + + + + ```sh + yarn + ``` + + + + + + ```sh + npm install + ``` + + + + +3. Still in the plugin directory (e.g., `src/plugins/my-plugin`), run the following command: + + + + + ```sh + yarn build + ``` + + + + + + ```sh + npm run build + ``` + + + + + This step transpiles the TypeScript files and outputs the JavaScript files to a `dist` directory that is unique to the plugin. + +4. Navigate back to the Strapi project root with `cd ../../..` and run the following commands to build the admin panel and start the server(s): + + + + + ```sh + yarn build + yarn develop + ``` + + + + + + ```sh + npm run build + npm run develop + ``` + + + + +
+
+ +You should now be ready to start developing your plugin. + +:::strapi What to read next? +You can either jump to the [plugin structure](/dev-docs/plugins/development/plugin-structure) documentation or read the [servers and hot reloading](#servers-and-hot-reloading) section to learn more about different ways to start the server. +::: + +:::info Did you know? +The admin panel needs to be rebuilt after its code has been modified. Rebuilding the admin panel is done by running the `build` command. The `strapi generate plugin` generates code that injects some plugin components (menu link, plugin homepage) into the admin panel. That's why we run the `build` command after the plugin code has been generated and before starting the server. +::: + +### Servers and hot reloading + +Strapi itself is **headless** . The admin panel is completely separate from the server. + +```mermaid +graph LR + A{Server} -->|Axios instance| B{Admin Panel} + B --> A +``` + +The server can be started in 2 different ways: you can run the backend server only or start both the server and admin panel servers. + +#### Start only the backend server + +To start only the backend server, run the following command: + + + + + +```bash +yarn develop +``` + + + + + +```bash +npm run develop +``` + + + + + +This will run the server on `localhost:1337` and enable hot reloading only on the back-end server, i.e. it will only auto-reload when changes are made to the server. If you are only doing development in the `./server` directory of your plugin, this will be faster. + +#### Start both the backend and admin panel servers + +If you are doing development on both the `/server` and `/admin` directories of your plugin, run the following command: + + + + + +```bash +yarn develop --watch-admin +``` + + + + + +```bash +npm run develop -- --watch-admin +``` + + + + +This will run the server on `localhost:1337` and enable hot reloading on both the back-end and front-end servers, i.e.it will auto-reload when changes are made to the server or the admin panel of Strapi. diff --git a/docusaurus/docs/dev-docs/plugins/development/plugin-structure.md b/docusaurus/docs/dev-docs/plugins/development/plugin-structure.md new file mode 100644 index 0000000000..ea99964e7c --- /dev/null +++ b/docusaurus/docs/dev-docs/plugins/development/plugin-structure.md @@ -0,0 +1,39 @@ +--- +title: Plugin structure +description: Learn more about the structure of a Strapi plugin +displayed_sidebar: devDocsSidebar +--- + +import InteractivePluginStructure from '@site/src/components/PluginStructure.js' + +# Plugin structure + +When [creating a plugin with the CLI generator](/dev-docs/plugins/development/create-a-plugin), Strapi generates the following boilerplate structure for you in the `./src/plugins/my-plugin` folder: + + + +A Strapi plugin is divided into 2 parts, each living in a different folder and offering a different API: + +| Plugin part | Description | Folder | API | +|-------------|-------------|--------------|-----| +| Admin panel | Includes what will be visible in the [admin panel](/user-docs/intro) (components, navigation, settings, etc.) | `/admin` |[Admin Panel API](/dev-docs/api/plugins/admin-panel-api)| +| Backend server | Includes what relates to the [backend server](/dev-docs/backend-customization) (content-types, controllers, middlewares, etc.) |`/server` |[Server API](/dev-docs/api/plugins/server-api)| + +
+ +:::note Notes about the usefulness of the different parts for your specific use case +- **Server-only plugin**: You can create a plugin that will just use the server part to enhance the API of your application. For instance, this plugin could have its own visible or invisible content-types, controller actions, and routes that are useful for a specific use case. In such a scenario, you don't need your plugin to have an interface in the admin panel. + +- **Admin panel plugin vs. application-specific customization**: You can create a plugin to inject some components into the admin panel. However, you can also achieve this by creating a `./src/admin/app.js` file and invoking the `bootstrap` lifecycle function to inject your components. In this case, deciding whether to create a plugin depends on whether you plan to reuse and distribute the code or if it's only useful for a unique Strapi application. +::: + +
+ +:::strapi What to read next? +The next steps of your Strapi plugin development journey will require you to use any of the Strapi plugins APIs. + +2 different types of resources help you understand how to use the plugin APIs: + +- The reference documentation for the [Admin Panel API](/dev-docs/api/plugins/admin-panel-api) and [Server API](/dev-docs/api/plugins/server-api) give an overview of what is possible to do with a Strapi plugin. +- [Guides](/dev-docs/plugins/developing-plugins#guides) cover some specific, use-case based examples. +::: diff --git a/docusaurus/docs/dev-docs/plugins/guides/marketplace.md b/docusaurus/docs/dev-docs/plugins/guides/marketplace.md new file mode 100644 index 0000000000..3ce1887eb6 --- /dev/null +++ b/docusaurus/docs/dev-docs/plugins/guides/marketplace.md @@ -0,0 +1,203 @@ +--- +title: Publishing a Strapi plugin to the Marketplace +# description: todo +displayed_sidebar: devDocsSidebar +--- + +# Publishing your Strapi plugin + +_Coming soon…_ + +:::tip +Check [this blog post](https://strapi.io/blog/how-to-create-a-strapi-v4-plugin-publish-on-npm-6-6) to learn how to publish your Strapi plugin on npm. +::: + + + + diff --git a/docusaurus/docs/dev-docs/plugins/guides/pass-data-from-server-to-admin.md b/docusaurus/docs/dev-docs/plugins/guides/pass-data-from-server-to-admin.md new file mode 100644 index 0000000000..bc82d0e3d5 --- /dev/null +++ b/docusaurus/docs/dev-docs/plugins/guides/pass-data-from-server-to-admin.md @@ -0,0 +1,101 @@ +--- +title: How to pass data from server to admin panel with a Strapi plugin +description: Learn how to pass data from server to admin panel with a Strapi plugin +sidebar_label: Pass data from server to admin +displayed_sidebar: devDocsSidebar +--- + +# How to pass data from server to admin panel with a Strapi plugin + +Strapi is **headless** . The admin panel is completely separate from the server. + +When [developing a Strapi plugin](/dev-docs/plugins/developing-plugins) you might want to pass data from the `/server` to the `/admin` folder. Within the `/server` folder you have access to the Strapi object and can do database queries whereas in the `/admin` folder you can't. + +Passing data from the `/server` to the `/admin` folder can be done using the admin panel's Axios instance: + +```mermaid +graph LR + A{Server} -->|Axios instance| B{Admin Panel} + B --> A +``` + +To pass data from the `/server` to `/admin` folder you would first [create a custom admin route](#create-a-custom-admin-route) and then [get the data returned in the admin panel](#get-the-data-in-the-admin-panel). + +## Create a custom admin route + +Admin routes are like the routes that you would have for any controller, except that the `type: 'admin'` declaration hides them from the general API router, and allows you to access them from the admin panel. + +The following code will declare a custom admin route for the `my-plugin` plugin: + +```js title="/my-plugin/server/routes/index.js" +module.exports = { + 'pass-data': { + type: 'admin', + routes: [ + { + method: 'GET', + path: '/pass-data', + handler: 'myPluginContentType.index', + config: { + policies: [], + auth: false, + }, + }, + ] + } + // ... +}; +``` + +This route will call the `index` method of the `myPluginContentType` controller when you send a GET request to the `/my-plugin/pass-data` URL endpoint. + +Let's create a basic custom controller that simply returns a simple text: + +```js title="/my-plugin/server/controllers/my-plugin-content-type.js" +'use strict'; + +module.exports = { + async index(ctx) { + ctx.body = 'You are in the my-plugin-content-type controller!'; + } +} +``` + +This means that when sending a GET request to the `/my-plugin/pass-data` URL endpoint, you should get the `You are in the my-plugin-content-type controller!` text returned with the response. + +## Get the data in the admin panel + +Any request sent from an admin panel component to the endpoint for which we defined the custom route `/my-plugin/pass-data` should now return the text message returned by the custom controller. + +So for instance, if you create an `/admin/src/api/foobar.js` file and copy and paste the following code example: + +```js title="/my-plugin/admin/src/api/foobar.js" +import axios from 'axios'; + +const foobarRequests = { + getFoobar: async () => { + const data = await axios.get(`/my-plugin/pass-data`); + return data; + }, +}; +export default foobarRequests; +``` + +You will be able to use `foobarRequests.getFoobar()` in the code of an admin panel component and have it return the `You are in the my-plugin-content-type controller!` text with the data. + +For instance, within a React component, you could use `useEffect` to get the data after the component initializes: + +```js title="/my-plugin/admin/src/components/MyComponent/index.js" +import foobarRequests from "../../api/foobar"; +const [foobar, setFoobar] = useState([]); + +// … +useEffect(() => { + foobarRequests.getFoobar().then(res => { + setSchemas(res.data); + }); +}, [setFoobar]); +// … +``` + +This would set the `You are in the my-plugin-content-type controller!` text within the `foobar` data of the component's state. diff --git a/docusaurus/docs/dev-docs/plugins/guides/store-and-access-data.md b/docusaurus/docs/dev-docs/plugins/guides/store-and-access-data.md new file mode 100644 index 0000000000..10a07d2e87 --- /dev/null +++ b/docusaurus/docs/dev-docs/plugins/guides/store-and-access-data.md @@ -0,0 +1,176 @@ +--- +title: How to store and access data from a Strapi plugin +description: Learn how to store and access data from a Strapi plugin +sidebar_label: Store and access data +displayed_sidebar: devDocsSidebar +--- + +# How to store and access data from a Strapi plugin + +To store data with a Strapi [plugin](/dev-docs/plugins/developing-plugins), use a plugin content-type. Plugin content-types work exactly like other [content-types](/dev-docs/backend-customization/models). Once the content-type is [created](#create-a-content-type-for-your-plugin), you can start [interacting with the data](#interact-with-data-from-the-plugin). + +## Create a content-type for your plugin + +To create a content-type with the CLI generator, run the following command in a terminal: + + + + +```bash +yarn strapi generate content-type +``` + + + + + +```bash +npm run strapi generate content-type +``` + + + + +The generator CLI is interactive and asks a few questions about the content-type and the attributes it will contain. Answer the first questions, then for the `Where do you want to add this model?` question, choose the `Add model to existing plugin` option and type the name of the related plugin when asked. + +
+ Generating a content-type plugin with the CLI +
The strapi generate content-type CLI generator is used to create a basic content-type for a plugin.
+
+ +
+ +The CLI will generate some code required to use your plugin, which includes the following: + +- the [content-type schema](/dev-docs/backend-customization/models#model-schema) +- and a basic [controller](/dev-docs/backend-customization/controllers), [service](/dev-docs/backend-customization/services), and [route](/dev-docs/backend-customization/routes) for the content-type + +:::tip +You may want to create the whole structure of your content-types either entirely with the CLI generator or by directly creating and editing `schema.json` files. We recommend you first create a simple content-type with the CLI generator and then leverage the [Content-Type Builder](/user-docs/content-type-builder) in the admin panel to edit your content-type. + +If your content-type is not visible in the admin panel, you might need to set the `content-manager.visible` and `content-type-builder.visible` parameters to `true` in the `pluginOptions` object of the content-type schema: + +
+Making a plugin content-type visible in the admin panel: + +The following highlighted lines in an example `schema.json` file show how to make a plugin content-type visible to the Content-Type Builder and Content-Manager: + +```json title="/server/content-types/my-plugin-content-type/schema.json" {13-20} showLineNumbers +{ + "kind": "collectionType", + "collectionName": "my_plugin_content_types", + "info": { + "singularName": "my-plugin-content-type", + "pluralName": "my-plugin-content-types", + "displayName": "My Plugin Content-Type" + }, + "options": { + "draftAndPublish": false, + "comment": "" + }, + "pluginOptions": { + "content-manager": { + "visible": true + }, + "content-type-builder": { + "visible": true + } + }, + "attributes": { + "name": { + "type": "string" + } + } +} + +``` + +
+::: + +### Ensure plugin content-types are imported + +The CLI generator might not have imported all the related content-type files for your plugin, so you might have to make the following adjustments after the `strapi generate content-type` CLI command has finished running: + +1. In the `/server/index.js` file, import the content-types: + + ```js {7,22} showLineNumbers title="/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, + }; + + ``` + +2. In the `/server/content-types/index.js` file, import the content-type folder: + + ```js title="/server/content-types/index.js" + 'use strict'; + + module.exports = { + // In the line below, replace my-plugin-content-type + // with the actual name and folder path of your content type + "my-plugin-content-type": require('./my-plugin-content-type'), + }; + ``` + +3. Ensure that the `/server/content-types/[your-content-type-name]` folder contains not only the `schema.json` file generated by the CLI, but also an `index.js` file that exports the content-type with the following code: + + ```js title="/server/content-types/my-plugin-content-type/index.js + 'use strict'; + + const schema = require('./schema'); + + module.exports = { + schema, + }; + ``` + +## Interact with data from the plugin + +Once you have created a content-type for your plugin, you can create, read, update, and delete data. + +:::note +A plugin can only interact with data from the `/server` folder. If you need to update data from the admin panel, please refer to the [passing data guide](/dev-docs/plugins/guides/pass-data-from-server-to-admin). +::: + +To create, read, update, and delete data, you can use either the [Entity Service API](/dev-docs/api/entity-service) or the [Query Engine API](/dev-docs/api/query-engine). While it's recommended to use the Entity Service API, especially if you need access to components or dynamic zones, the Query Engine API is useful if you need unrestricted access to the underlying database. + +Use the `plugin::your-plugin-slug.the-plugin-content-type-name` syntax for content-type identifiers in Entity Service and Query Engine API queries. + +**Example:** + +Here is how to find all the entries for the `my-plugin-content-type` collection type created for a plugin called `my-plugin`: + +```js +// Using the Entity Service API +let data = await strapi.entityService.findMany('plugin::my-plugin.my-plugin-content-type'); + +// Using the Query Engine API +let data = await strapi.db.query('plugin::my-plugin.my-plugin-content-type').findMany(); +```` + +:::tip +You can access the database via the `strapi` object which can be found in `middlewares`, `policies`, `controllers`, `services`, as well as from the `register`, `boostrap`, `destroy` lifecycle functions. +::: diff --git a/docusaurus/sidebars.js b/docusaurus/sidebars.js index f287a0d137..c334483cda 100644 --- a/docusaurus/sidebars.js +++ b/docusaurus/sidebars.js @@ -215,15 +215,6 @@ const sidebars = { "dev-docs/api/query-engine/order-pagination", ], }, - { - type: 'category', - label: 'APIs for plugins', - collapsed: false, - items: [ - 'dev-docs/api/plugins/admin-panel-api', - 'dev-docs/api/plugins/server-api', - ] - }, ] }, { @@ -300,14 +291,7 @@ const sidebars = { } ] }, - 'dev-docs/plugins-extension', - 'dev-docs/plugins-development', 'dev-docs/typescript', - { - type: 'doc', - label: 'Custom fields', - id: 'dev-docs/custom-fields', - }, { type: "doc", label: "Providers", @@ -465,6 +449,8 @@ const sidebars = { label: 'Introduction', id: 'dev-docs/plugins/developing-plugins' }, + 'dev-docs/plugins/development/create-a-plugin', + 'dev-docs/plugins/development/plugin-structure', { type: 'doc', id: 'dev-docs/api/plugins/admin-panel-api', @@ -477,6 +463,18 @@ const sidebars = { }, 'dev-docs/custom-fields', 'dev-docs/plugins-extension', + { + type: 'category', + label: 'Guides', + link: { + type: 'doc', + id: 'dev-docs/plugins/developing-plugins', + }, + items: [ + 'dev-docs/plugins/guides/store-and-access-data', + 'dev-docs/plugins/guides/pass-data-from-server-to-admin', + ] + } ] } ] diff --git a/docusaurus/src/components/PluginStructure.js b/docusaurus/src/components/PluginStructure.js new file mode 100644 index 0000000000..5e8073d801 --- /dev/null +++ b/docusaurus/src/components/PluginStructure.js @@ -0,0 +1,131 @@ +import React from 'react' +import Tabs from '@theme/Tabs' +import TabItem from '@theme/TabItem' + +export default function InteractivePluginStructure() { + return ( +
+ + + + The following diagram is interactive: you can click on any file or folder name highlighted in purple to go to the corresponding documentation section.

+ +
+        
+        . # root of the plugin folder (e.g., /src/plugins/my-plugin)
+ β”œβ”€β”€ admin # Admin panel part of your plugin.
+ β”‚ └── src
+ β”‚ β”œβ”€β”€ components # Contains your front-end components
+ β”‚ β”‚ β”œβ”€β”€ Initializer
+ β”‚ β”‚ β”‚ └── index.js # Plugin initializer
+ β”‚ β”‚ └── PluginIcon
+ β”‚ β”‚ └── index.js # Contains the icon of your plugin in the main navigation
+ β”‚ β”œβ”€β”€ pages # Contains the pages of your plugin
+ β”‚ β”‚ β”œβ”€β”€ App
+ β”‚ β”‚ β”‚ └── index.js # Skeleton around the actual pages
+ β”‚ β”‚ └── HomePage
+ β”‚ β”‚ └── index.js # Homepage of your plugin
+ β”‚ β”œβ”€β”€ translations # Translations files to make your plugin i18n-friendly
+ β”‚ β”‚ β”œβ”€β”€ en.json
+ β”‚ β”‚ └── fr.json
+ β”‚ └── utils
+ β”‚ β”‚ └── getTrad.js # getTrad function to return the corresponding plugin translations
+ β”‚ β”œβ”€β”€ index.js # Main setup of your plugin, used to register elements in the admin panel
+ β”‚ └── pluginId.js # pluginId variable computed from package.json name
+ β”œβ”€β”€ node_modules
+ β”œβ”€β”€ server # Back-end part of your plugin
+ β”‚ β”œβ”€β”€ config
+ β”‚ β”‚ └── index.js # Contains the default server configuration
+ β”‚ β”œβ”€β”€ content-types # Content-types specific to your plugin
+ β”‚ β”‚ └── index.js # Loads all the plugin's content-types
+ β”‚ β”œβ”€β”€ controllers # Controllers specific to your plugin
+ β”‚ β”‚ β”œβ”€β”€ index.js # Loads all the plugin's controllers
+ β”‚ β”‚ └── my-controller.js # Custom controller example. You can rename it or delete it.
+ β”‚ β”œβ”€β”€ middlewares # Middlewares specific to your plugin
+ β”‚ β”‚ └── index.js # Loads all the plugin's middlewares
+ β”‚ β”œβ”€β”€ policies # Policies specific to your plugin
+ β”‚ β”‚ └── index.js # Loads all the plugin's policies
+ β”‚ β”œβ”€β”€ routes # Routes specific to your plugin
+ β”‚ β”‚ └── index.js # Contains an example route for the my-controller custom controller example
+ β”‚ └── services # Services specific to your plugin
+ β”‚ β”‚ β”œβ”€β”€ index.js # Loads all the plugin's services
+ β”‚ β”‚ └── my-service.js # Custom service example. You can rename it or delete it.
+ β”‚ β”œβ”€β”€ bootstrap.js # Function that is called right after the plugin has registered
+ β”‚ β”œβ”€β”€ destroy.js # Function that is called to clean up the plugin after Strapi instance is destroyed
+ β”‚ β”œβ”€β”€ index.js # Loads the code for all the server elements
+ β”‚ └── register.js # Function that is called to load the plugin, before bootstrap.
+ β”œβ”€β”€ package.json
+ β”œβ”€β”€ README.md
+ β”œβ”€β”€ strapi-admin.js # Entrypoint for the admin panel (front end)
+ └── strapi-server.js # Entrypoint for the server (back end)
+ +
+
+ +
+ + + + The following diagram is interactive: you can click on any file or folder name highlighted in purple to go to the corresponding documentation section.

+ +
+        
+        . # root of the plugin folder (e.g., /src/plugins/my-plugin)
+ β”œβ”€β”€ admin # Admin panel part of your plugin.
+ β”‚ └── src
+ β”‚ β”œβ”€β”€ components # Contains your front-end components
+ β”‚ β”‚ β”œβ”€β”€ Initializer
+ β”‚ β”‚ β”‚ └── index.tsx # Plugin initializer
+ β”‚ β”‚ └── PluginIcon
+ β”‚ β”‚ └── index.tsx # Contains the icon of your plugin in the main navigation
+ β”‚ β”œβ”€β”€ pages # Contains the pages of your plugin
+ β”‚ β”‚ β”œβ”€β”€ App
+ β”‚ β”‚ β”‚ └── index.tsx # Skeleton around the actual pages
+ β”‚ β”‚ └── HomePage
+ β”‚ β”‚ └── index.tsx # Homepage of your plugin
+ β”‚ β”œβ”€β”€ translations # Translations files to make your plugin i18n-friendly
+ β”‚ β”‚ β”œβ”€β”€ en.json
+ β”‚ β”‚ └── fr.json
+ β”‚ └── utils
+ β”‚ β”‚ └── getTrad.ts # getTrad function to return the corresponding plugin translations
+ β”‚ β”œβ”€β”€ index.tsx # Main setup of your plugin, used to register elements in the admin panel
+ β”‚ └── pluginId.tsx # pluginId variable computed from package.tsxon name
+ β”œβ”€β”€ dist # Build of the backend
+ β”œβ”€β”€ node_modules
+ β”œβ”€β”€ server # Back-end part of your plugin
+ β”‚ β”œβ”€β”€ config
+ β”‚ β”‚ └── index.ts # Contains the default server configuration
+ β”‚ β”œβ”€β”€ content-types # Content-types specific to your plugin
+ β”‚ β”‚ └── index.ts # Loads all the plugin's content-types
+ β”‚ β”œβ”€β”€ controllers # Controllers specific to your plugin
+ β”‚ β”‚ β”œβ”€β”€ index.ts # Loads all the plugin's controllers
+ β”‚ β”‚ └── my-controller.ts # Custom controller example. You can rename it or delete it.
+ β”‚ β”œβ”€β”€ middlewares # Middlewares specific to your plugin
+ β”‚ β”‚ └── index.ts # Loads all the plugin's middlewares
+ β”‚ β”œβ”€β”€ policies # Policies specific to your plugin
+ β”‚ β”‚ └── index.ts # Loads all the plugin's policies
+ β”‚ β”œβ”€β”€ routes # Routes specific to your plugin
+ β”‚ β”‚ └── index.ts # Contains an example route for the my-controller custom controller example
+ β”‚ └── services # Services specific to your plugin
+ β”‚ β”‚ β”œβ”€β”€ index.ts # Loads all the plugin's services
+ β”‚ β”‚ └── my-service.ts # Custom service example. You can rename it or delete it.
+ β”‚ β”œβ”€β”€ bootstrap.ts # Function that is called right after the plugin has registered
+ β”‚ β”œβ”€β”€ destroy.ts # Function that is called to clean up the plugin after Strapi instance is destroyed
+ β”‚ β”œβ”€β”€ index.ts # Loads the code for all the server elements
+ β”‚ └── register.ts # Function that is called to load the plugin, before bootstrap.
+ β”œβ”€β”€ custom.d.ts # Generated types
+ β”œβ”€β”€ package.json
+ β”œβ”€β”€ README.md
+ β”œβ”€β”€ strapi-admin.js # Entrypoint for the admin panel (front end)
+ β”œβ”€β”€ strapi-server.js # Entrypoint for the server (back end)
+ β”œβ”€β”€ tsconfig.json # TypeScript compiler options for the admin panel part
+ └── tsconfig.server.json # TypeScript compiler options for the server part
+
+
+ +
+
+
+ ); +} + diff --git a/docusaurus/src/components/ReusableAnnotationComponents/ReusableAnnotationComponents.jsx b/docusaurus/src/components/ReusableAnnotationComponents/ReusableAnnotationComponents.jsx new file mode 100644 index 0000000000..0e60356ccf --- /dev/null +++ b/docusaurus/src/components/ReusableAnnotationComponents/ReusableAnnotationComponents.jsx @@ -0,0 +1,36 @@ +import React from 'react' +import { Annotation } from '../Annotation'; + +export function PluginsConfigurationFile() { + return ( + +

+ The plugins configuration file config/plugins.js|ts: +

    +
  • declares all plugins that are enabled,
  • +
  • and can be used to pass additional configuration options to some plugins.
  • +
+

+

+ More details can be found in the plugins configuration documentation. +

+
+ ) +} + +export function HeadlessCms() { + return ( + +

+ A headless CMS is a Content Management System that separates the presentation layer (i.e., the front end, where content is displayed) from the back end (where content is managed). +

+

+ Strapi is a headless CMS that provides: +

    +
  • a back-end server exposing an API for your content,
  • +
  • and a graphical user interface, called the admin panel, to manage the content.
  • +
The presentation layer of your website or application powered by Strapi should be handled by another framework, not by Strapi. +

+
+ ) +} diff --git a/docusaurus/src/theme/MDXComponents.js b/docusaurus/src/theme/MDXComponents.js index 639a88788f..22bd80e4b9 100644 --- a/docusaurus/src/theme/MDXComponents.js +++ b/docusaurus/src/theme/MDXComponents.js @@ -28,6 +28,7 @@ import { } from '../components/MultiLanguageSwitcher'; import { Annotation } from '../components/Annotation'; import SubtleCallout from '../components/SubtleCallout'; +import { PluginsConfigurationFile, HeadlessCms } from '../components/ReusableAnnotationComponents/ReusableAnnotationComponents'; export default { // Re-use the default mapping @@ -65,4 +66,9 @@ export default { MultiLanguageSwitcherRequest, MultiLanguageSwitcherResponse, Annotation, + /** + * Reusable annotation components go belowπŸ‘‡ + */ + PluginsConfigurationFile, + HeadlessCms }; diff --git a/docusaurus/static/img/assets/development/generate-plugin-content-type.png b/docusaurus/static/img/assets/development/generate-plugin-content-type.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9cd617a5a4e51cde7f3132cba0ee6d80441d0a GIT binary patch literal 74136 zcmagF19T-@*Y_LSHak{F9ox1#RwwD$NyoOW9dvAUY?~e1wtaV>bDrlt@4a_?-yWmJ zu3EL$s$FZ%sx{|t{&$$7yaXZ~9vlb=2%?mvs4@r$m=FjEs2&Uyu*BbL)Efi@F4sat zL{UmaghbK7_M3&3DF}#USW+^yqRJ7L?}x`MK7+4s;#3An7KpO2d9Gwt9$Gw#a2PX+ zYB@;+T@#k5sG#nYTDX4{nWYfDrX~dZBF7L}PGtlnKJ5jVh~2}uhwXYA7uQB+=0_sW zL#HE1PV5qy5?(ooV9RF}g8dVzh_I-iTfrc(o1mx$pi$$)D9pmbV4!5I_ZQb4*n$c7 z4gDsSJ|7>Q;bbW(-Jl?FLY#3K-BJ>d77Y$jnj-RpTNsA9FWILx%YVCz4D|#y1a6vxRPV?C85FAviW3BT6SU1w00s(`1dAS&AQoZ9 z52qZ&QV?kfI>>-$5ptx<+YUrE;O8cUIh0u!q#fic$l4~O8%(|dN*l<}O+K6u5*TPD z654#EBf;QUE)(!+QjQ^fxWJwqO={3>5n)NN3coMHL5irVP-?>LQ}%~!PM|GNcY+VO z-sTWLz`cT%KI5tf|1uzVW=;@E7h#_$G> z$pr}yR2DnRqgQmoK*x*>7oo`QD|RjhQ-v*sQ;Yd7=A2{mGru^cSizh=J-jfNVT#dQ z!0A(ZfL^p-$htqHh{n&1sg$Y4>9<3rTMh)spJB{{oW`1|I0(dbUsMvTVi zMo`QbHJatL^EfA=cfA8fD%E8*+SML4h>KsWkX=A{f_t}q+wXH~=zNZj8tvQLx!;W5 zoY=A1g0d&R`qYNB4s{U_(+hvq{D|hs@J{fKPp!DxtSh`&XWn`D>p zSrUhe7A-2QvJb`xjyXhAx|~XnlAo-DB2MzhCn{xXDZynyS_(pPU5dK|{m?Cwn7%>AN<=?eSDY z_#>>lDMMzXDMQ(boircHemMsDU8)9j|`>eUg{Wi?jwG|SxN>@{JF zO!9Xt`qV~LxO1G8EPTWBj#biBk(|lzNbXpi6>-a~%Ey%Dl^9j|OIHhcOY`!LiqHyb zl?!zC%EMJL3%=)%D9fp=75)(ZrEzydP{9?+)y9=^@O!eE{UBgjhaH(6@YU~Yz_RYI z$zwKW+dI`e!sGGd81^Z=Z+N+QbZqw)I`eK^8t#>&Iuon@%~bpRQ-SQ`Y`tt6mPAvh zzX@h%=C9|_EY7A|itm)Q)mB7!#9B39GVeo?)CT1wa#YG4^$xh?f(CL5rll=X%zw6| zw|KXptx2yjuG#Y$w@bF`v_rKIK8t#_c*lF!c(=Y6`$Y@IcH;$b2S5iyh_o2iZrSuA z^&*Q8h);`WM5adtN6kfQ4J-{f55&k)Q=U_f%9YBVry9u}6_ylw$hD3euzJ*))H&2; z>{mAjG9N%E>G=Arx z^C)903s6U{NGgA;aIDa-*jP+mva=eoK3`O}^0Hc3X;|!NU~Sx4I;(3nQ}~5kyJ50n z^D);wEp)1Q@p;>PGj&sQYf(a@Fl4H6s*2k%lQ(OgC(HhM_jEJ!$g}5(2^&5|HRWr{ z7UTfD8$1#tj@_K2X{&mR^qRR1tc^gc)SC0!(z)8X0^coP6Hy3nFiv44#sKO7odTUg zjoHrw=t5RUhPrY1y}c8)&AGjbUBV;X{kJ}e$&d?`1J+~9i`M1FapWEB&BorUn1cT8 z>hGFA-=p6x-rIPI&!j#v zTN>N+eeZ)a(%!bSSF#V;9>8*ETK;AJd7YnMpu@H1YC9>SieXwazG3%N`KjQvfC~LH z>@@5zSpCKBQ`&n?GP)Wv`^4Ve)BU#1A9fMV?PC|sTU&~!^Bc93XD?T zGzM@Z5LGI#%J)T{l8EwrncQ($S@W^c3JQ_}460~_a7+xddJPU*F+)0uO!17adL5Qe z#hikk)ZinUnbYwlk@R9&Xz0Vp@$dAF<=5pgbb0ETIweiYO|_0mOQqvw!L?qsK3Y+F z<63JS;;wQN>F>WHeKo|Kw=cx7f2D z!hh_32x;+b_O$ojpiGf_@e%!?eyp*qJKN{W=)|;xuf+a}nT+AR)U)L9Ms<=c?UTNk zUjNH7qqo6prDi2)#lyAfqL@*ceuNQk5x2gsBvoBU@zrKwMt4E_RQmpc@;v!8ITUvHVd!Xw4^n?xqrGkd(;;y4jFAD?H}?l**3P$ z7S^wG*9*O7PLqk*YFw>n1Xnui&0#l72ZPI^)=W&7ObGQ%);?~```cMExhXA-&^jGI z`VU6>k;Dg|$|^M`bsRffp1I$C+#rVF%VphXMRhKH%rEXu%{k3peUoWaakZTE2RJsa z+Uho)Ilqh$&S&AfVy~YaMV+=UU~f>h54Ll73Y@*4Kx-in5Zkx~x~pDlZrKl`k5j32 zX1uSHIL89c9*!?O@!oH@K+HD#iE({AamPHw-PKw0SyfrBSUtb>ndQGc;a{$6xAG{x16Q z`-b8TA0tw_d31uFlub?R1N}+}pm#7FYN+-0hwY4dC-GltuVS?}>s6hZI z+QFM$t1iW3i0sA1#@(9&youJww-3llQ3%Dy+cX5A&#G>!DfLZG4ulrC4+8=kVgUjH z+yez}c)$$=1Ux<%1RD5_2HZq*!2WX?)(X#&FQ#tq!HHgz&2akI9vapZR6Bm1ic zH*o(?F%ucdUsaqe`N%Zo6iGyE9ZX5SFn(tIOvVpKLPEmpVDgPySycR==D;I9GIJ*< zJ8mW>S65d?S5`(_2QwySE-o&n&n!$VEDXRJ436$LPKIs_Hjd@sT|N>-{(g31U8QH#3GbsWo0{_0!KD4d_H*AewfG{0RE(js|5sHR}c0Ep~3RR|2RjBX%MDhFhK($=}Y*G@07J-X=57(kqa=?1| zpL^_Dit;U!+OHjDB$vh7@cH0NqSJ_WaBw(e@_B+cH8l<5#iRd8gV}V2FoJoFOu)H0 z3O%Ypr2x3C*r9hiL3VzB==|U+3wA=b?5;5$%x84lF-{pS6JWbc*r?L2ZXk<1qr>10 zxHB`>AdzaUInbDpbZwm0|S{49v_|Xdm573KRiC>e;ilN!6=`WW>-DxY;2=?18+Jckk1`eTyQ!Bbi($k$pUh9cKHZ2R z(L2B0&MG7V0F3hm#6GV|&pbbFi!WR6mn{p{Cj~xa^?lxc$uM)rJ}c3WNJpgV+`fgy@gE?u-ty@HGyqd+F5P%h)kbTlCk zOoHp)NRp|MR;x<|wM43@<$SqRijG6rZ~a=6u-_8ew-LiIaF~?T)VzxE)tOL15YkAA zNeTjQs>yBduLlAuL2#Jnx@FLWw9IIwuVoHgElyl;GcJV~PX5HdW;z-+Cl46S|#@75ED2d||;js1@JMvVk*5i!7<_if-{ z4k`TmT8lFcKR;l;N}q|IvHe!r{k=N)x!o+z=!~j}hV>uYV-4^SZtwO(d~#*9=J_ z_3Jh?RyB-YZC#z%Q@2S;%4)~UIgb*KA`%6%On7d+$eZ0j^s}B@@G`L*=aGWXGkSM= zVZ}E$EFAnq`N!aHvQSrW2pOd;ZfEo9JTZrhFD@9n5)*drd7biE+`~Mf^_0|IvxRau ziI8_w8ao3~{k0*k(8j%sZ|khoa^35&3<1q}|Cq~Ch;JDh1oM?8aWc-U^uP=bJ*aKR zQz8AE8=?qPOjjwm3>y8XRL*H4h*AF(F<9q%Fq4BADX7jq<}CvUf3kYp4gRu`?f~ct zw&XPfc7JE{g-Ts@?_yYbOT(T(5l+usgSnn~A`BwUd_f%ia*_1gMY|YSee{8_D`72= zr(Y3Hr#5cEGug@0-jE$#>U4=M2qV=*t?dX{B%15hZLkjbt^24YnOoPQKIl~P^%%Bm zoo`u=36OU=m%>LOVlWpBms4=WBWvq*-{(qmhaQ%sA#Y6o^WvlczBo}{ZR>@>WZ=rd zmo=c_{II*@!32mryLNykS_Cxz83|&qPjZS#bW!+ARJ6L$Qq5X*-|CI};hy(1YIS%h9|V0Nb^KTEB;?L?TfzX~0m#)MYP-SsHYojI;V7>`zR&>hM94ODw}I~BoIOz= z8{U9n)N(@4Yy+uYo}3h8c7?_Vgb|ld7lHd0mH#ZEmxE-ngJ^;J4aA<8e$=dsun-hR zz*mtG<`p_7QjZ;35IF+|BuX;tX3zO zK=>clT(hY;Q;WAgA^O+myM}c8`@wpxHra!YezEZ~eu73Pr6*JL-yDPxLrV3$9;W)8 zFNMC87SvG8W4q342)=>(g7st7(g&^6#fF81DY3?53s=hL5S?eumjQ#AI!>|p_9lbH zG@L$c-TURNn0ACRb56+HSi=32gZK#g+f!T$y?MYvFK49p9evf7LQ5as>MdOV`>Z|bFb&_+LnWOT*ejj*DgiV zG<;gJ7Lt+#`onV^65zeIcIM`pI)Rg+ugCkgYuC`*8p^!0T&c^`AKu2^q4;O*K%y+7 zasAjZv14vZb?s^chrB}Ct$|=xiMTA|LW6Sw#IDq)H>5Y+g-~E?>YkcZRk`{vjgm|K zMAr1N`-b3|SG^nL=wr~{gO))_-!CexcXn!Qf9;IlS{IEEDBhXNu4}&`Qb%sRX>MOF zWAY%Zs@GVN+!Gbh<83#Ydb)S1#@psHUP?&9t>HiZac{Qs0N67_Xkq%VcfcCqd%z`R zrXG3e(OZj1Nqq*6!5`Abkkcl#K%ZBiNkUu z6XoIh|H}c~A~#6PxnyQ#_^+R6fWnE4a=A)~g-Ix8@BCP=(?RsK_qpWfBD>Y0mDuLI zwr$c)Jh#g!wHbnteC8tJ%)!%;T%bNv=W8v2WY~Ua$y}$;2Mkx*w{8^b3A3+a*>H^x zks@xpm$`|MVq)9j=$K)73H(%@*sA)$F@OCM&J|QU=g8i2;J; z-;U&jAAFBTU8(duPKP8#?8X^S0m%H4b!L+j*hnzOzTl|#cG*bhX-vVZoXUW>hS93F z?&Y0WNou~urCHxy$C>*F?Pir4jxbp|_>8*uEpu7nHm75VJNEW@iApFjk=lFbV2MekuG}D{z!d6OeQ7Y@J zS1`*EZ;g5*3hp?sVnMefz1}UY;NG`Hn^jQ`#HMq%6StEp>x9eNtNFv;G;m;V>u0X&0F)8`GiVk`=B@?JRNyc@m^XBJSB8hzNQnQq0N?dy&991 z&fpFDxcH4gD^iTvvj;1Ki=pEwt^1P3as-rl|-kfd2~bV z(dIPvBu%A(A!S>IscE~s%9C{aaRo;ip~16jtizc&8RZ|o)lVue>lE>?dmNP=!>6qATfcEJ+4i>G7j+i z4=92}>CN_t_zqE^an~1rwrcj*KHnBDF8`vQAW}fyxx!7*_7U551Sch4=@{3=*vIb2 zQeX-XEecrjqmVIwxiq}yYH)-md_5kWeb8>?{O+;wV+7X(VVyuO4ERVXPQi374c?&Z za(^`)8&#F!qw|;-^0*f>6bV%B4MwaxCd~(BG9Km|{7@!9mO0+EygQx?r!q>4jm>#f z6z-oM-V0}m)+*q9ZrcVwbt~9R-KHQk8BJm!IDR_F#s(DkQsK+scGT9^VnDNvV=FMx zznUD)S7Z!v8FYbIo=S=U%>!BncQC(ppqqK3-0qW}@nyWofxzo!Zx8Vf6hDEATn(n= zv(G`6Yd*poxW*ckhI;yMU<@=Z8>+yqZq=@$p<^FZm6;Bmomuf2%PYpRNInaLn5{&s zRJYYdO2E6x>1>(ZHzX^2gJ)}D<8bg~Zv2fM?`2|C_)$6C(P9N#~= zGw+RPx&K-x%B2;!Pj%K0`~Wz-SQ_jl*{-Oo5r0-Zm(g)3kT`&DG_#~Y&BLqvb+JU{@4hmx z*~ieA;WQa^0!&XO-#@$oAFiH-ECN|ow0ytCYJ^Fg-=53(91=@eozpMnU(EA{bhc-7 zGP_!Te1OtAz6(F89^D0Q7Yut|IpJrpBBv(Xu1w&W=}4CzI5Gj;;}X@5XVeP3IF&BT z=O4KG!%ONP@B`}f9WVHpaIFx&Kt3Y51q@G2m+qGhmrjg1VQQZ^ozgc>0OLdFG`r8k z+@q)q@aU+NRMEdH7CS|cYbRq%RZHUYulkk7Fkc#m-hvVFF^q!!m}YXAjR%Ss^gQI2 zNea;^?WjRgUpZq-es396q24%+Sa&`o1XYNze35-`K{Od~yJ&yVi-Xs1V=LYtOCx{q zl&bTiIT28@=&mBE7sCw2yjeG*&R+KMlQ zK6qSC6)UtGlRZ7T_Uap5Rs0JTvMcY;*XUlwqwpwp);qjfuX}@j{)Qehz39Ej66C9T zcY9J8=!#xR?iu#er--SD2mECsc+x18JG)ySm=w7a^+(|;6(;e~qeH4C#Imu&dW|y2 z>mmiw*_&Kne$PrPrtOcb)zGS`hK(|+D7sC>><5&oz=rQXx-0TZzui@-w@ZKg&@5=< z5VzmeRwByz)K^egQmVi=?wmrc2Zgpr9=xGMZLTO-%Kwx&NA&hv_crLV!tUd({4+ad zKkQER=(cQ1+coXhqSr9qcAW`sq@&O5U~K>#&$+l=j{iS0a4wBIqRVMF-w8Tuo#1*2KcS7v@%AkB~*q> zpnVBG0B)dbkKq$97J;P%^icB&wiu_NP+Ns~QMEfnc>P9{pM!YXp)T1IjpTPhvSu1l2SidFA5gQ6oTr9f%@S}UnFQpC< z6OBXEBd{1^F%E2gpUo7=OfgG>4`L@1)|kwdX)ygbN}Q$7o2Y{n`(7I__-Ig+nxOd< zTb^Ol5+)u^AVolu^0^^`sYCO6Z8uN=h2UpMTuIV2|#||up z5x2R3Sa!P$VVQR;_I`Wrlg6#VjN>FJ?aLA&O74GM$F6_KJFDsx|F!O!5q;I#d=h|M ze5&jElU46)x~P=yhnN)?YKZaUGYJz$>GN%!^4V@~fK%Ycj@*aqvKDvZ{XO^e)fI+H z2N>bwHUoF93*uP@PsqsXBL{blEpd(bPzIiN%H(i>AM+zyOgn4g?1bw^(#m6}j!;co z{+R^u)pH#^{qx#>zW2Og8(W`jV%MW^m$ALZfy7(2?_Hjx>b=(8o#9I}Ru->kAd=Tj zR6m~l_|@HqERRH+Sh$x%wdMIxI(wpdBR)b*MXG+2! z&VLxPZ&Z)Xdb!^BIYrkcZFS{lt9~Wei*BW+1N7GAewF+o7#=!j02N#{%c?F z=^=7wmdI$z^zhH3fTMHM!H@7P?oks@x4ZA*QnLB&tY(MbIu@dMr-^zzCToL5Bg)>uAJIxd|iT0VZemGF)H$=f4bB76iqmQY^H4;H+6>gwSG*kFm~8jApI9C zO)ijpOjo^%KuAC>9+|*^#`9&rlpNSceh{$}>fJ;b^d~b6U*iYZ82^bnfq<-Q0p9VV zp09qVV%BHOo6Ioc%VF~YpstjZ+O+Q5I7|XRj5?ZJioSRACqq=QBPkUd0{u;(i;IwN zHa@bp1!f7=V0{wPF5kr4&4JTA?Egh3g)zyXQc*EywR?uyep@sm%jLHi6g?fuX(sqn zln^av#~%vCRUK*$=EFyN%-cvu&%bz#1iuC)0EG1bH$U6lHQ%o1@d)zdV85+HhZYZBvv$;Dp^;fo9vBB+xk3 zUDb&e5z!v4fd^+i1c$=vCk7q3W|AI0$7x-|HFU8#oJml_d5R|h_~Nt&OXL+OoIB6c zPiF?+8Bh)k1Wby^UIX@qo>z%QDUSEvABEhnB4tZlgz04Y--MbS&Of6Ajz4YTmRoKx zKFn4!Sf9QR9i8{?h6Pur6K)Yx-%n1Lm(TL@DR%=roQ9RvWi-15s~wc8nKdh9dw>9) z6CLJ}R;VB&IoH8wQnwP05`of5mJR4hCG3$Xa%sNgZ0smPm}19O&}qs6FkSm}Udw*d_K5LZx(@wkz@Dwbn-Zk1mHG zHVh_ez(war2X6`$z)g50m$Rm>`clM$gKKF+8bkB4n@hBMhSUq_fyFmSZ_$%Q!cTIf zF`&9Q^!Do!$#VmN&*PT6g#RymCbRW(DRg(5QUY!L%Ab6*0xnn~Uc|jT4~sSF;nmkM zS;~^+$mkc$>$O>zjTvs*KQL)$%ej);j%g!&aNoN@>5v-ABvNRHwOgw&We{mMFU2my z_O0I(RbvO_8zqk(D|PE#vC0jyM2RkqKR%VRTEG$Rbc#@;oz^p`E3X~UgMC`4GWsj#-=+WPs{H)TeccR{Y z?=cL(J5sW;|wYYf1a_3 z*Qsz2*ze4+mNQc#<5zC7Rk#W+o$$;uW73A+&=a_1nKmilz5xFez%sMA4E_@ z-Jcp`Iw81pP@eHq;p!kT23-RE*zmI}<}l{#L45haQ`g+ej_2|t8UKDs^9R?=}kbcgyNFvzczPGgZ{|);*xH`|BN?` zlY=4{*LUwVPL)Ws$!#Nfj{}{3~$jijguZi7~QlkUt3VtX3Ap1Q>A2)dKJCNo@?!NG)gEmv%iFiK- z6&6_Nm2-eTZbY^6Q1qyJr;GO@8j;0^c|?}Bi?^f*u0Pq)81mkFM3Jp_8;=`uldb0~ zpjF*JCsRoN-W1Nf%zf7kAw8t|$D}S4et;a#g)b-_LUp-M;Qg0s&P4`3mmq|dIidTT zgj4IuWGBO+qma=hmh;ykr7gec>j+}A3j=(%Y}(Uj@7jC>-jaww1_@3bOiXT~TtxEJ`1lApTRi>& zU_pT(_rd8Ou|W`(hL->E@jr{VPA_imD8|QMP?Vk(VQJK$sWSi?HARlT%ayN8t*uS}VM@78qf=kfz zeljgpE(mw>Q^bCId0-klXEa|A9SsUV77EQy+CeL0QugH}YYmL;@{0)m3$Jwr`3nLV z>aXs0)Ut4oXdRVwpMHBYiS;K=dgwueCl)a%ggPh^B31O}27CUn2XNb*yQ+e*WB@xf;K82NZ;BJd3be*#9X zntn!EU+m*WD+N}r`qM-?Gm1&}{>sI|DZBL2UGSQGW=;*fLgMTSCrkQLf|SjfF$P_W zsZvl$(@)hlua-n45BIEKcDh)T3O(ls4vjIG5uXrd?+r}IIQuu;p*JaH^Y=WI6ahxC zi9Lwpt|RNS+Amm>^r{W~wyW_VgS9?4+e_Cg`4jjkFbZJ!Z{bM0S2RjsG@+@U13c80 z<|`%_U(iN4vz$3Gf(SrL6k1)9B^-$V5GygVpB9ea-YXF%u!$zzz5E~b4b(5>>YqyJ zqdy!Ik?6U)C?5!re1~L=`TGpXLPdm7LTq!=*)7qsi|Mc0?A~QVkO<3@L-(U%ut~pQ zEH8%jQV*TEZg`nZHq5|0TOhw$U}j2-_RJ28Y(OW7EjYFs=>U`24s>WwZv&glp{#xd z*a}E$!VKCCx8G^)J2N%OK^U^V<$h$AcPST0C-J%me)WCmwe>v2_6m}*nZ)94dlrdg zXMhfIk9)MZ=T|BmJ$ve~i0&LPq{|Oyy)3eAMS)}AKq(DYrNCp}mw)rR8lH8Sh_h+3 zeC1r`bFb|fcZ}l39O6_Eszw;xs8b_+(lgZ=t`O)`1}9wUkgIg>NX;hxhI%zND`g|D zsKvW{WTn6r5GmBip#em^IR+?~Z+jtAxVSegYRZ!%9e01|>^$Df@DPP`qT-({LcNG& z&|0gj4523}KTdKo+M~I9U(z=9u7enE@=W>{YuYUm6f>FZfk?V!SAfsE`&Jk?!7I94 zAW9=W0|SFTFRt=}JsDe23Oz8KOQ;0}htjl;3oZ|UMownYl)U9cfkxaCnMzr}Y1^H8 zf?4SXwY;06aM64?Ukf_mxo9Kz`suS-y7Fik#r^ht2Omlo{Af+mx7)MGj5U5zR@H%a zddF93lbi!IEE=Rl%i(6r1xCmvrR;!n=}1m~)oI#|PM=O;O?V!C5AH>rwr704AN99> zoJJ&leBeUg2q*f^bZZ~ZWK%4bBP$A3RI^HEKgnauf1h}D>Y%5=JV4J>8T888#@Dfl zf~@JWYhi=N|8vn5wU+&JG?{=TGWq)q*4w+g96`T zqiv3(oEfgK9}5}FZ|ldDMox!W)gszRrk#R%Y%mSrKJ zg>s2*+zU~)BJ^!{&Euk-47=m=(PSE{#CeU$AqUj>;K@jl0(|xdFnx~3hNWqj?{q{= z`Z*YhkTx71gJQfF*^-xh2)-E#5zhp&&}%1(14AMtr9(Ut$MDMEVegj1;V+EC$Zr(u z_`6tXX7K)OB`8Ms$uQ)55V9NDeP;5K`yD>`@sGQZt{Rft+@xt5l|sq&%dK9%4GOc5 z`xgh-H3n(1qZ7QaY^219M}fJNHeghpt1OU8lF)9G@Vh+(f~TKP8}t(+RwCq^VOb~y zZvQ7_Q#em9uvTh1cBm|M!Rhr92+~99<)mjz8xWP>TgB(Jd+p3Sg7yf8{1lNDr*i03y;$sqwV);bkepJ4k3&H>l*nFNgc%Nu9>|D%MhWEXdtZ6Dq!XOm}-Di5?cpO^!cAlDX))w%S&QjqU(DMdC1E_c9mbqa&FIFQpq z+LI_7(S;2~RHIt$p}8#P&gF^0OZmLrEhskvqe!7a5=5PjYEK9w$e=%*#!8E92*yZE zkl!jR!Q&tWpV6GSf0TQ}^9GUc{c)#u?7j;ec}R0He#Zp$nvc$eWdNw|7^?jW)OTFd zhmhsNBr6M9@zn!r^r>u&1-&}oHFt8K?@rJqQmKG;-Rg1{n#4bB9F+LFPQj!VZM`D> zg3a(Lx<{VMod#zMO?3h_TuO4Ypg=0|_nm%UGCFsM8FCGU=yey}Tf&lRzNjb2%4rha zQKR=qa+`Ip9%e@q&Bz%Y|6>k4a!ndrjvO_|{}Js-4sxx+^HU)c*_k%F4md48owq6v zj1bz3I!Sp%85&QXtKQ$QSbV%b)t@D$6rB4}L|809@6a@eBhq?bQPevR$<&)kpU>da zL94dFUYHQ@N&>At z`|}`v*{prNejPAicleZ}D7Uw$cyx5cX16K0l)T<(tA8}B#6DSp�*Aj;jnH##qAR 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 z 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 U#!nRWF7N?|#d%v(g0WA^zoGEh9{>OV literal 0 HcmV?d00001