From 6985f94f839fcf3cecf89b2f361e3ccb35963b07 Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Fri, 1 Nov 2024 03:57:36 -0700 Subject: [PATCH] Merge what-is-an-add-on.md and add-on-configuration-pipeline.md into "Volto add-on concepts" (addons/index.md). Eventually move this single file to `conceptual-guides/add-ons.md`. --- .../addons/add-on-configuration-pipeline.md | 74 ---------- docs/source/addons/configuration-pipeline.png | Bin 45332 -> 0 bytes docs/source/addons/how-an-add-on-works.md | 2 +- docs/source/addons/index.md | 137 +++++++++++++++++- docs/source/addons/what-is-an-add-on.md | 66 --------- 5 files changed, 131 insertions(+), 148 deletions(-) delete mode 100644 docs/source/addons/add-on-configuration-pipeline.md delete mode 100644 docs/source/addons/configuration-pipeline.png delete mode 100644 docs/source/addons/what-is-an-add-on.md diff --git a/docs/source/addons/add-on-configuration-pipeline.md b/docs/source/addons/add-on-configuration-pipeline.md deleted file mode 100644 index 45cfc87ed2..0000000000 --- a/docs/source/addons/add-on-configuration-pipeline.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -myst: - html_meta: - "description": "Add-on and project configuration pipeline" - "property=og:description": "Add-on and project configuration pipeline" - "property=og:title": "Add-on and project configuration pipeline" - "keywords": "Volto, Plone, Volto add-ons, Volto Project" ---- -%Explanation -# Add-on and project configuration pipeline - -Volto build its configuration out of Volto's configuration defaults, add-ons configuration, and project configuration. -This is called the configuration pipeline. - -![Volto configuration pipeline](./configuration-pipeline.png) - -It's applied in this particular order. -Configurations can be overriden at a later stage. - -## All-in with add-on approach - -You can take full advantage of the configuration pipeline and do not use the project configuration at all. -You can create a "policy" core product for your project, and use another for your project's theme. -This way, the project itself renders as a simple boilerplate, expendable or rebuild-able at any time. -You can also reuse add-ons across projects, and adjust them using another add-ons, depending on the other projects requirements. - -```{deprecated} Volto 18.0.0 -The project configuration approach is deprecated and will be removed in Volto 19. -``` - -## Define your add-ons programatically - -Having the `addons` key in `package.json` is not flexibile enough in complex scenarios. -You can load your add-ons programatically, outside `package.json` using `volto.config.js` like this: - -```js -module.exports = { - addons: ['@eeacms/volto-accordion-block'] -} -``` - -This is an "escape hatch" where you can use logic and environment conditions to define the add-ons to be loaded in the current project. Take a look: - - -```js -let addons = []; -if (process.env.MY_SPECIAL_ENV_VAR) { // Does not have to be RAZZLE_ - addons = ['volto-my-awesome-special-add-on']; -} - -if (process.env.MARKER_FOR_MY_SECRET_PROJECT) { // Does not have to be RAZZLE_ - addons = [ - '@kitconcept/volto-heading-block', - '@kitconcept/volto-slider-block', - 'volto-my-secret-project-add-on', - ]; -} - -module.exports = { - addons: addons, -}; -``` - -They are added to the existing ones in `package.json`. - -```{important} -Adding the add-on package to the `addons` key is mandatory. -It tells Volto to treat that package properly, providing it with Babel language features. -In Plone terminology, it is like including a Python egg in the `zcml` section of `zc.buildout`. -``` - -```{seealso} -{doc}`../configuration/volto-config-js` -``` diff --git a/docs/source/addons/configuration-pipeline.png b/docs/source/addons/configuration-pipeline.png deleted file mode 100644 index 7f5f1e953bfcc58cd3dc3a60278dc28bf4ce98a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45332 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 with transpilation by Babel, whole-process customization via {file}`razzle.extend.js`, and integration with Volto's {term}`configuration registry`. ``` + +### Practical application + +In practice with the configuration pipeline, for example, you can create a "policy" core add-on for your project, and use another add-on for your project's theme. +This way the project itself renders as a simple boilerplate, which you can extend or rebuild at any time. + +You can also reuse add-ons across projects, and adjust them using other add-ons, depending on the other projects' requirements. + + +% TODO: Should this section be moved to a how-to guide? +### Define your add-ons programmatically + +The `addons` key in the {file}`package.json` file alone might not be flexible enough in complex scenarios. +You can programmatically load your add-ons outside your {file}`package.json` file using a {file}`volto.config.js` file with the following content. + +```js +module.exports = { + addons: ['@eeacms/volto-accordion-block'] +} +``` + +This creates an "escape hatch", where you can use logic and environment conditions to define the add-ons to load in the current project, as in the next example. +The add-ons that you define here will be added to the existing ones in {file}`package.json`. + +```js +let addons = []; +if (process.env.MY_SPECIAL_ENV_VAR) { // Does not have to be RAZZLE_ + addons = ['volto-my-awesome-special-add-on']; +} + +if (process.env.MARKER_FOR_MY_SECRET_PROJECT) { // Does not have to be RAZZLE_ + addons = [ + '@kitconcept/volto-heading-block', + '@kitconcept/volto-slider-block', + 'volto-my-secret-project-add-on', + ]; +} + +module.exports = { + addons: addons, +}; +``` + +```{important} +You must add the `addons` key with the value of your add-on package's name wherever you configure it. +In Plone terminology, it is like including a Python egg in the `zcml` section of `zc.buildout`. +``` + +```{seealso} +{doc}`../configuration/volto-config-js` +``` + + +## Publish an add-on + +Volto add-ons should not be transpiled. +They should be released as "source" packages. + +Their primary entry point (the `main` key of their {file}`package.json`) must point to a module that exports a default function, which acts as a default configuration loader for that package. + +You can publish an add-on to an npm registry or to a remote repository host such as GitHub or GitLab, like any other package. +If you publish your add-on to the [npm Registry](https://www.npmjs.com/) or make your repository public, as a bonus, you will benefit from collaborating on open source software. + + +% Where does this go? +By using [`mrs-developer`](https://github.com/collective/mrs-developer), it's possible to have a workflow similar to `zc.buildout`'s `mr.developer`, where you can "checkout" an add-on for development. +[Eric Brehault](https://github.com/ebrehault) ported this amazing Python tool. + + + ```{toctree} :maxdepth: 1 :hidden: -what-is-an-add-on how-an-add-on-works -add-on-configuration-pipeline ``` diff --git a/docs/source/addons/what-is-an-add-on.md b/docs/source/addons/what-is-an-add-on.md deleted file mode 100644 index 4dff7dea60..0000000000 --- a/docs/source/addons/what-is-an-add-on.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -myst: - html_meta: - "description": "Volto add-on concepts" - "property=og:description": "Volto add-on concepts" - "property=og:title": "Volto add-on concepts" - "keywords": "add-on, Volto, package" ---- - -# Volto add-on concepts - -Volto add-on packages are just CommonJS or ESM packages. -Their main purpose is to encapsulate logic, configuration, components, customizations, and even themes in a reusable way. - -Suppose you want to have more control and flexibility beyond the plain Volto project when building a site. -You can build a Volto {term}`add-on` and make it available as a generic JavaScript package by publishing it to an npm registry. -Then you can reuse and include it in any Volto project. -As a bonus, you will benefit from collaborating on open source software. - - - -Volto add-ons should not be transpiled. -They should be released as "source" packages. -Their primary entry point (the `main` key of their {file}`package.json`) must point to a module that exports a default function, which acts as a default configuration loader for that package. - - - - -Add-ons are applied in the order they are declared in the `addons` key of {file}`package.json` or programmatically via a provided configuration file. -Add-ons can override configuration coming from other add-ons, providing a hierarchy of configuration stacks. - -An add-on can be published in an npm registry, just as any other package. -However, add-ons are meant not to be transpiled, but built along with your app code. -They can be released as "source" packages or used directly in your app as local code. - -Add-ons can be chained, where each one can configure the app in some way. -If needed, each add-on in the chain can override or extend the previous configuration that other add-ons set. -Thus, the order in which you register add-ons matters. - -Add-ons can define shadowed components. -"Component shadowing" is a technique for overriding modules of other packages at build time. -This technique builds upon the `resolve.aliases` facilities of bundlers, so modules can be replaced when the app is being built. - -Volto will automatically provide aliases for your package. -Once you've released it, you don't need to change import paths, since you can use the final ones from the very beginning. -This means that you can use imports, such as `import { Something } from '@plone/my-volto-add-on'` without any extra configuration. - -```{note} -By declaring a JavaScript package as a Volto add-on, Volto provides several integration features. -These include language features with transpilation by Babel, whole-process customization via {file}`razzle.extend.js`, and integration with Volto's {term}`configuration registry`. -``` - -The add-on can be published to an npm registry or directly installed from GitHub by the package manager. -By using [`mrs-developer`](https://github.com/collective/mrs-developer), it's possible to have a workflow similar to `zc.buildout`'s `mr.developer`, where you can "checkout" an add-on for development. -[Eric Brehault](https://github.com/ebrehault) ported this amazing Python tool. - -An add-on can configure any of the following aspects of Volto. - -- provide additional views and blocks -- override or extend Volto's built-in views, blocks, and settings -- shadow or customize Volto's, or another add-on's, modules -- register custom routes -- provide custom {term}`Redux` actions and reducers -- register custom Express middleware for Volto's server process -- tweak Volto's webpack configuration, loading custom Razzle and webpack plugins -- even provide a custom theme