From a16c9ce8a489b16f14d5a6d0b3f0ab116f81188d Mon Sep 17 00:00:00 2001 From: Victor Fernandez de Alba Date: Fri, 11 Oct 2024 18:18:51 +0200 Subject: [PATCH 1/2] First batch of the overhaul of the add-ons section --- .../addons/addon-configuration-pipeline.md | 68 +++ docs/source/addons/configuration-pipeline.png | Bin 0 -> 45332 bytes docs/source/addons/how-an-add-on-works.md | 118 ++++ .../how-to-create-an-addon-prerelease.md | 184 ++++++ .../addons/how-to-create-an-addon-stable.md | 21 + .../addons/how-to-extend-eslint-addon.md | 41 ++ .../addons/how-to-extend-webpack-addon.md | 50 ++ .../how-to-install-an-addon-dev-prerelease.md | 131 +++++ .../how-to-install-an-addon-dev-stable.md | 142 +++++ .../how-to-install-an-addon-prerelease.md | 51 ++ .../addons/how-to-install-an-addon-stable.md | 51 ++ .../addons/how-to-load-addon-configuration.md | 70 +++ .../how-to-testing-addons-prerelease.md | 13 + docs/source/addons/how-to-testing-addons.md | 105 ++++ .../how-to-troubleshoot-transpilation.md | 82 +++ docs/source/addons/index.md | 541 ++---------------- docs/source/addons/public-folder.md | 2 +- docs/source/addons/what-is-an-addon.md | 45 ++ 18 files changed, 1213 insertions(+), 502 deletions(-) create mode 100644 docs/source/addons/addon-configuration-pipeline.md create mode 100644 docs/source/addons/configuration-pipeline.png create mode 100644 docs/source/addons/how-an-add-on-works.md create mode 100644 docs/source/addons/how-to-create-an-addon-prerelease.md create mode 100644 docs/source/addons/how-to-create-an-addon-stable.md create mode 100644 docs/source/addons/how-to-extend-eslint-addon.md create mode 100644 docs/source/addons/how-to-extend-webpack-addon.md create mode 100644 docs/source/addons/how-to-install-an-addon-dev-prerelease.md create mode 100644 docs/source/addons/how-to-install-an-addon-dev-stable.md create mode 100644 docs/source/addons/how-to-install-an-addon-prerelease.md create mode 100644 docs/source/addons/how-to-install-an-addon-stable.md create mode 100644 docs/source/addons/how-to-load-addon-configuration.md create mode 100644 docs/source/addons/how-to-testing-addons-prerelease.md create mode 100644 docs/source/addons/how-to-testing-addons.md create mode 100644 docs/source/addons/how-to-troubleshoot-transpilation.md create mode 100644 docs/source/addons/what-is-an-addon.md diff --git a/docs/source/addons/addon-configuration-pipeline.md b/docs/source/addons/addon-configuration-pipeline.md new file mode 100644 index 0000000000..59ced77c4a --- /dev/null +++ b/docs/source/addons/addon-configuration-pipeline.md @@ -0,0 +1,68 @@ +--- +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`. + +```{seealso} +{doc}`../configuration/volto-config-js` +``` diff --git a/docs/source/addons/configuration-pipeline.png b/docs/source/addons/configuration-pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5f1e953bfcc58cd3dc3a60278dc28bf4ce98a7 GIT binary patch literal 45332 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 config`. +That is, it should take the `global` configuration object and return it, possibly mutated or changed. +So your main `index.js` will look like: + +```js +export default function applyConfig(config) { + config.blocks.blocksConfig.faq_viewer = { + id: 'faq_viewer', + title: 'FAQ Viewer', + edit: FAQBlockEdit, + view: FAQBlockView, + icon: chartIcon, + group: 'common', + restricted: false, + mostUsed: true, + sidebarTab: 1, + security: { + addPermission: [], + view: [], + }, + }; + return config; +} +``` + +And the `package.json` file of your add-on: + +```json +{ + "main": "src/index.js", +} +``` + +In effect, Volto does the equivalent of: + +``` +import installMyVoltoAddon from 'my-volto-addon' + +// ... in the configuration registry setup step: +const configRegistry = installMyVoltoAddon(defaultRegistry); +``` + +So the Volto add-on needs to export a default function that receives the Volto configuration registry, is free to change the registry as it sees fit, then it needs to return that registry. + +Volto will chain-execute all the add-on configuration functions to compute the final configuration registry. + +```{info} +An add-on's default configuration method will always be loaded. +``` + +### Providing optional add-on configurations + +You can export additional configuration functions from your add-on's main +`index.js`. + +```js +import applyConfig, {loadOptionalBlocks,overrideSomeDefaultBlock} from './config'; + +export { loadOptionalBlocks, overrideSomeDefaultBlock }; +export default applyConfig; +``` + +```{seealso} +{doc}`./how-to-load-addon-configuration` +``` + +## Customizations + +Add-on packages can include customization folders, just like the Volto projects. +The customizations are resolved in the order: add-ons (as sorted in the `addons` key of your project's `package.json`) then the customizations in the Volto project, last one wins. + +```{tip} +See the {ref}`advanced-customization-scenarios-label` section on how to enhance this pattern and how to include customizations inside add-ons. +``` + +## Add-on dependencies + +Add-ons can depend on any other JavaScript package, but they can also depend on other Volto add-ons. +To do this, specify the name of your Volto add-on dependency in your `dependencies` key of `package.json` and create a new `addons` key in the `package.json` of your add-on, where you specify the extra Volto add-on dependency. + +By doing this, the add-ons can "chain-load" one another, so you don't have to keep track of intermediary dependencies. + +```json +{ + "name": "volto-slate", + + "addons": ["@eeacms/volto-object-widget"] +} +``` diff --git a/docs/source/addons/how-to-create-an-addon-prerelease.md b/docs/source/addons/how-to-create-an-addon-prerelease.md new file mode 100644 index 0000000000..2c8334b540 --- /dev/null +++ b/docs/source/addons/how-to-create-an-addon-prerelease.md @@ -0,0 +1,184 @@ +--- +myst: + html_meta: + "description": "How to create a frontend add-on (development or pre-release)" + "property=og:description": "How to create a frontend add-on (development or pre-release)" + "property=og:title": "How to create a frontend add-on (development or pre-release)" + "keywords": "add-on, Volto, create" +--- + +# How to create a frontend add-on (development or pre-release) + +This chapter describes how you can create a Volto add-on using the latest **development release** version of Plone with **Volto 18 or later** for the frontend, while having full control over its development and deployment. + +```{versionadded} Volto 18.0.0-alpha.43 +{term}`Cookieplone` is now the method to create a Plone add-on with unstable versions of Volto, version 18.0.0-alpha.43 and above. +``` + +Follow the steps required to install [Cookieplone]({doc}`plone:install/create-project-cookieplone.md`). + +```shell +pipx run cookieplone frontend_addon +``` + +```console +❯ pipx run cookieplone frontend_addon +⚠️ cookieplone is already on your PATH and installed at /Users/sneridagh/.local/bin/cookieplone. Downloading and running anyway. +╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── cookieplone ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ .xxxxxxxxxxxxxx. │ +│ ;xxxxxxxxxxxxxxxxxxxxxx; │ +│ ;xxxxxxxxxxxxxxxxxxxxxxxxxxxx; │ +│ xxxxxxxxxx xxxxxxxxxx │ +│ xxxxxxxx. .xxxxxxxx │ +│ xxxxxxx xxxxxxx: xxxxxxx │ +│ :xxxxxx xxxxxxxxxx xxxxxx: │ +│ :xxxxx+ xxxxxxxxxxx +xxxxx: │ +│ .xxxxx. :xxxxxxxxxx .xxxxx. │ +│ xxxxx+ ;xxxxxxxx +xxxxx │ +│ xxxxx +xx. xxxxx. │ +│ xxxxx: .xxxxxxxx :xxxxx │ +│ xxxxx .xxxxxxxxxx xxxxx │ +│ xxxxx xxxxxxxxxxx xxxxx │ +│ xxxxx .xxxxxxxxxx xxxxx │ +│ xxxxx: .xxxxxxxx :xxxxx │ +│ .xxxxx ;xx. ... xxxxx. │ +│ xxxxx+ :xxxxxxxx +xxxxx │ +│ .xxxxx. :xxxxxxxxxx .xxxxx. │ +│ :xxxxx+ xxxxxxxxxxx ;xxxxx: │ +│ :xxxxxx xxxxxxxxxx xxxxxx: │ +│ xxxxxxx xxxxxxx; xxxxxxx │ +│ xxxxxxxx. .xxxxxxxx │ +│ xxxxxxxxxx xxxxxxxxxx │ +│ ;xxxxxxxxxxxxxxxxxxxxxxxxxxxx+ │ +│ ;xxxxxxxxxxxxxxxxxxxxxx; │ +│ .xxxxxxxxxxxxxx. │ +│ │ +╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +You've downloaded /Users/sneridagh/.cookiecutters/cookieplone-templates before. Is it okay to delete and re-download it? [y/n] (y): +╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Volto Addon Generator ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ Creating a new Volto Addon │ +│ │ +│ Sanity check results: │ +│ │ +│ │ +│ - Node: ✓ │ +│ - git: ✓ │ +│ │ +╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + [1/8] Add-on Title (Volto Add-on): + [2/8] Add-on (Short name of the addon) (volto-addon): + [3/8] A short description of your addon (A new add-on for Volto): + [4/8] Author (Plone Community): + [5/8] Author E-mail (collective@plone.org): + [6/8] GitHub Username or Organization (collective): + [7/8] Package name on NPM (volto-addon): + [8/8] Volto version (18.0.0-alpha.46): +╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Volto Add-on generation ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ Summary: │ +│ │ +│ - Volto version: 18.0.0-alpha.46 │ +│ - Output folder: /Users/sneridagh/Development/plone/volto-addon │ +│ │ +│ │ +╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 🎉 New addon was generated 🎉 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ volto-addon │ +│ │ +│ Now, enter the generated directory and finish the install: │ +│ │ +│ cd volto-addon │ +│ make install │ +│ │ +│ start coding, and push to your organization. │ +│ │ +│ Sorry for the convenience, │ +│ The Plone Community. │ +│ │ +│ https://plone.org/ +``` + +Cookieplone has created a folder with the name of the add-on. +Change your current working directory to {file}`volto-addon`. + +```shell +cd volto-addon +``` + +To install the frontend setup, use the following command. + +```shell +make install +``` + +### Start Plone backend Docker container + +In the currently open session, issue the following command. + +```shell +make backend-docker-start +``` + +```console +❯ make backend-docker-start +==> Start Docker-based Plone Backend +======================================================================================= +Creating Plone volto SITE: Plone +Aditional profiles: +THIS IS NOT MEANT TO BE USED IN PRODUCTION +Read about it: https://6.docs.plone.org/install/containers/images/backend.html +======================================================================================= +Ignoring index for /app/var/filestorage/Data.fs +INFO:Plone Site Creation:Creating a new Plone site @ Plone +INFO:Plone Site Creation: - Using the voltolighttheme distribution and answers from /app/scripts/default.json +INFO:Plone Site Creation: - Stopping site creation, as there is already a site with id Plone at the instance. Set DELETE_EXISTING=1 to delete the existing site before creating a new one. +Using default configuration +2024-10-11 16:12:47 INFO [chameleon.config:39][MainThread] directory cache: /app/var/cache. +2024-10-11 16:12:48 INFO [plone.restapi.patches:16][MainThread] PATCH: Disabled ZPublisher.HTTPRequest.ZopeFieldStorage.VALUE_LIMIT. This enables file uploads larger than 1MB. +2024-10-11 16:12:49 INFO [plone.volto:23][MainThread] Aliasing collective.folderish classes to plone.volto classes. +2024-10-11 16:12:50 INFO [Zope:42][MainThread] Ready to handle requests +Starting server in PID 1. +2024-10-11 16:12:50 INFO [waitress:486][MainThread] Serving on http://0.0.0.0:8080 +``` + +This will start a clean Plone server for development purposes so you can start developing your add-on. + +### Start Plone development frontend + +Create a second shell session in a new window. +Change your current working directory to {file}`volto-addon`. +Start the Plone development frontend with the following command. + +```shell +make start +``` + +```console +webpack 5.90.1 compiled successfully in 11004 ms +sswp> Handling Hot Module Reloading +Using volto.config.js in: //frontend/volto.config.js +✅ Server-side HMR Enabled! +Volto is running in SEAMLESS mode +Proxying API requests from http://localhost:3000/++api++ to http://localhost:8080/Plone +🎭 Volto started at 0.0.0.0:3000 🚀 +``` + +Note that the Plone frontend uses an internal proxy server to connect with the Plone backend. +Open a browser at the following URL to visit your Plone site. + +http://localhost:3000 + +You will see a page similar to the following. + +```{image} /_static/plone-home-page.png +:alt: Plone home page +:class: figure +``` + +Your newly created add-on will be installed by default in a vanilla core Volto. +You can start developing it in the add-on package located in: {file}`packages/volto-addon`. + +You can stop the site with {kbd}`ctrl-c`. diff --git a/docs/source/addons/how-to-create-an-addon-stable.md b/docs/source/addons/how-to-create-an-addon-stable.md new file mode 100644 index 0000000000..e79ae37285 --- /dev/null +++ b/docs/source/addons/how-to-create-an-addon-stable.md @@ -0,0 +1,21 @@ +--- +myst: + html_meta: + "description": "How to create a frontend add-on" + "property=og:description": "How to create a frontend add-on" + "property=og:title": "How to create a frontend add-on" + "keywords": "add-on, Volto, create" +--- + +# How to create a frontend add-on (stable release) + +Volto add-on packages are just CommonJS packages. +The only requirement is that they point the `main` key of their `package.json` to a module that exports, as a default function that acts as a {term}`Volto configuration loader`. + +Although you could simply use `npm init` to generate an add-on initial code, we now have a nice +[Yeoman-based generator](https://github.com/plone/generator-volto) that you can use: + +```shell +npm install -g @plone/generator-volto +yo @plone/volto:addon [] [options] +``` diff --git a/docs/source/addons/how-to-extend-eslint-addon.md b/docs/source/addons/how-to-extend-eslint-addon.md new file mode 100644 index 0000000000..a98804fec3 --- /dev/null +++ b/docs/source/addons/how-to-extend-eslint-addon.md @@ -0,0 +1,41 @@ +--- +myst: + html_meta: + "description": "Extend ESlint configuration from add-ons" + "property=og:description": "Extend ESlint configuration from add-ons" + "property=og:title": "Extend ESlint configuration from add-ons" + "keywords": "Volto, add-on, extensions, frontend, Plone, configuration, ESlint, lint" +--- + +# Extending Eslint configuration from an add-on + +Starting with Volto v16.4.0, you can also customize the Eslint configuration from an add-on. +You should provide a `eslint.extend.js` file in your add-on root folder, which exports a `modify(defaultConfig)` function. +For example, to host some code outside the regular `src/` folder of your add-on, this `eslint.extend.js` file is needed: + +```js +const path = require('path'); + +module.exports = { + modify(defaultConfig) { + const aliasMap = defaultConfig.settings['import/resolver'].alias.map; + const addonPath = aliasMap.find( + ([name]) => name === '@plone-collective/some-volto-add-on', + )[1]; + + const extraPath = path.resolve(`${addonPath}/../extra`); + aliasMap.push(['@plone-collective/extra', extraPath]); + + return defaultConfig; + }, +}; +``` + +This would allow the `@plone-collective/some-volto-add-on` to host some code +outside of its normal `src/` folder, let's say in the `extra` folder, and that +code would be available under the `@plone-collective/extra` name. + +```{note} +This is taking care only of the Eslint integration. +For proper language support, you'll still need to do it in the `razzle.extend.js` of your add-on. +``` diff --git a/docs/source/addons/how-to-extend-webpack-addon.md b/docs/source/addons/how-to-extend-webpack-addon.md new file mode 100644 index 0000000000..b43c8f9095 --- /dev/null +++ b/docs/source/addons/how-to-extend-webpack-addon.md @@ -0,0 +1,50 @@ +--- +myst: + html_meta: + "description": "Extend Webpack setup from an add-on with `razzle.extend.js`" + "property=og:description": "Extend Webpack setup from an add-on with `razzle.extend.js`" + "property=og:title": "Extend Webpack setup from an add-on with `razzle.extend.js`" + "keywords": "Volto, Plone, Webpack, Volto add-on" +--- + +# Extend Webpack setup from an add-on with `razzle.extend.js` + +Just like you can extend Razzle's configuration from the project, you can do so +with an addon, as well. You should provide a `razzle.extend.js` file in your +addon root folder. Here's an example of such file, where we achieve two things: + +- we add a new webpack plugin, the + [bundle-analyzer](https://www.npmjs.com/package/webpack-bundle-analyzer) +- we reconfigure the `theme.config` alias, to enable a custom Semantic theme inside the addon: + +```js +const analyzerPlugin = { + name: 'bundle-analyzer', + options: { + analyzerHost: '0.0.0.0', + analyzerMode: 'static', + generateStatsFile: true, + statsFilename: 'stats.json', + reportFilename: 'reports.html', + openAnalyzer: false, + }, +}; + +const plugins = (defaultPlugins) => { + return defaultPlugins.concat([analyzerPlugin]); +}; +const modify = (config, { target, dev }, webpack) => { + const themeConfigPath = `${__dirname}/theme/theme.config`; + config.resolve.alias['../../theme.config$'] = themeConfigPath; + + return config; +}; + +module.exports = { + plugins, + modify, +}; +``` + +Check +[volto-searchlib razzle.extend.js](https://github.com/eea/volto-searchlib/blob/d84fec8eec1def0088d8025eaf5d7197074b95a7/razzle.extend.js) file for an example on how to include additional paths to the Babel configuration and how to add additional webpack name aliases. diff --git a/docs/source/addons/how-to-install-an-addon-dev-prerelease.md b/docs/source/addons/how-to-install-an-addon-dev-prerelease.md new file mode 100644 index 0000000000..36f840fcd8 --- /dev/null +++ b/docs/source/addons/how-to-install-an-addon-dev-prerelease.md @@ -0,0 +1,131 @@ +--- +myst: + html_meta: + "description": "How to install a frontend add-on in development mode in your Plone project" + "property=og:description": "How to install a frontend add-on in development mode in your Plone project" + "property=og:title": "How to install a frontend add-on in development mode" + "keywords": "Volto, Plone, Volto add-on, unreleased, development" +--- + +# How to install a frontend add-on in development mode (development or pre-release) + +We use `mrs-developer` tool to manage the development cycle of Volto add-ons. +This tool help us to pull the remote code and configure the current project to have the add-on(s) available for the build. + +[Eric Brehault](https://github.com/ebrehault) ported this amazing Python tool, +which provides a way to pull a package from git and set it up as a dependency +for the current project codebase. + +To facilitate addon development lifecycle we recommend using +[mrs-developer](https://www.npmjs.com/package/mrs-developer). + +By doing this, you can develop both the project and the add-on product as if +they were both part of the current codebase. Once the add-on development is +done, you can publish the package to an npm repository. + +`mrs-developer` is included and installed by default when you generate a project with Cookieplone. +There is a `Makefile` command that installs the configuration of `mrs.developer.json` in your project. + +```shell +make install +``` + +## mrs.developer.json + +This is the configuration file that instructs `mrs-developer` from where it has +to pull the packages. +The generator includes an empty one for you, edit `mrs.developer.json` and add: + +```json +{ + "acme-volto-foo-addon": { + "output": "packages", + "package": "@acme/volto-foo-addon", + "url": "git@github.com:acme/my-volto-addon.git", + "path": "src" + } +} +``` + +Then run: + +```bash +make install +``` + +Now the addon is found in `packages/acme-volto-foo-addon`. + +```{note} +`package` property is optional, set it up only if your package has a scope (namespace). +`src` is required if the content of your addon is located in the `src` +directory (but, as that is the convention recommended for all Volto add-on +packages, you will always include it) +``` + +If you want to know more about `mrs-developer` config options, please refer to +[its npm page](https://www.npmjs.com/package/mrs-developer). + +## tsconfig.json / jsconfig.json + +Cookieplone setup does not require that `mrs-developer` tweaks the base `tsconfig.json/jsconfig.json`, since `pnpm` takes care of the resolution "the right way". +This is different from the `yarn` setup, that required it. + +### Addon development lifecycle + +If you want to "disable" using the development version of an addon, or keep +a more stable version of `mrs.developer.json` in your source code repository, +you can set its developing status by adding a `develop` key: + +```json +{ + "acme-volto-foo-addon": { + "output": "packages", + "package": "@acme/volto-foo-addon", + "url": "git@github.com:acme/my-volto-addon.git", + "path": "src", + "develop": true + } +} +``` + +You can toggle that key to `false` and run `make install` again. + +### Addon dependencies + +If your addon needs to bring in additional JavaScript package dependencies, +you'll have to declare them as normal package dependencies. + +### `pnpm` workspaces + +Your add-on needs to be detected by your setup as a workspace. +You can configure them using `pnpm-workspace.yaml` file and declare every development add-on in there. + +```yaml +packages: + - 'core/packages/*' + - 'packages/*' +``` + +If the add-on you are developing uses the `pnpm` setup as well (recommended), then you have to add: + +```yaml +packages: + - 'core/packages' + - 'packages/my-policy-addon' + - 'packages/**/packages/*' +``` + +for detecting them. +Declaring the add-ons explicitly works too: + +```yaml +packages: + - 'core/packages' + - 'packages/my-policy-addon' + - 'packages/my-development-mode-addon' + - 'packages/**/packages/*' +``` + +```{warning} +Don't forget to run `make install` after any change in this files to update the setup. +``` diff --git a/docs/source/addons/how-to-install-an-addon-dev-stable.md b/docs/source/addons/how-to-install-an-addon-dev-stable.md new file mode 100644 index 0000000000..f2a4fd975a --- /dev/null +++ b/docs/source/addons/how-to-install-an-addon-dev-stable.md @@ -0,0 +1,142 @@ +--- +myst: + html_meta: + "description": "How to install a frontend add-on in development mode in your Plone project" + "property=og:description": "How to install a frontend add-on in development mode in your Plone project" + "property=og:title": "How to install a frontend add-on in development mode" + "keywords": "Volto, Plone, Volto add-on, unreleased, development" +--- + +# How to install a frontend add-on in development mode (stable release) + +We use `mrs-developer` tool to manage the development cycle of Volto add-ons. +This tool help us to pull the remote code and configure the current project to have the add-on(s) available for the build. + +## Add `mrs-developer` dependency and related script + +[Eric Brehault](https://github.com/ebrehault) ported this amazing Python tool, +which provides a way to pull a package from git and set it up as a dependency +for the current project codebase. + +To facilitate addon development lifecycle we recommend using +[mrs-developer](https://www.npmjs.com/package/mrs-developer). + +By doing this, you can develop both the project and the add-on product as if +they were both part of the current codebase. Once the add-on development is +done, you can publish the package to an npm repository. + +`mrs-developer` is included and installed by default when you generate a project with the generator. +There is a `Makefile` command that installs the configuration of `mrs.developer.json` in your project. + +```shell +make install +``` + +## mrs.developer.json + +This is the configuration file that instructs `mrs-developer` from where it has +to pull the packages. +The generator includes an empty one for you, edit `mrs.developer.json` and add: + +```json +{ + "acme-volto-foo-addon": { + "package": "@acme/volto-foo-addon", + "url": "git@github.com:acme/my-volto-addon.git", + "path": "src" + } +} +``` + +Then run: + +```bash +make install +``` + +Now the addon is found in `src/addons/`. + +```{note} +`package` property is optional, set it up only if your package has a scope (namespace). +`src` is required if the content of your addon is located in the `src` +directory (but, as that is the convention recommended for all Volto add-on +packages, you will always include it) +``` + +If you want to know more about `mrs-developer` config options, please refer to +[its npm page](https://www.npmjs.com/package/mrs-developer). + +## tsconfig.json / jsconfig.json + +`mrs-developer` automatically manages the contents of this file for you, but if you choose not +to use mrs-developer, you'll have to add something like this to your +`tsconfig.json` or `jsconfig.json` file in the Volto project root: + +```json +{ + "compilerOptions": { + "paths": { + "acme-volto-foo-addon": [ + "addons/acme-volto-foo-addon/src" + ] + }, + "baseUrl": "src" + } +} +``` + +This is required so the project "knows" about your package in development and the imports to work correctly. + +```{warning} +Please note that both `paths` and `baseUrl` are required to match your +project layout. +``` + +```{tip} +You should use the `src` path inside your package and point the `main` key +in `package.json` to the `index.js` file in `src/index.js`. +``` + +### Addon development lifecycle + +If you want to "disable" using the development version of an addon, or keep +a more stable version of `mrs.developer.json` in your source code repository, +you can set its developing status by adding a `develop` key: + +```json +{ + "acme-volto-foo-addon": { + "package": "@acme/volto-foo-addon", + "url": "git@github.com:acme/my-volto-addon.git", + "path": "src", + "develop": true + } +} +``` + +You can toggle that key to `false` and run `make install` again. + +### Addon dependencies, yarn workspaces + +If your addon needs to bring in additional JavaScript package dependencies, +you'll have to set your addon package as a "Yarn workspace". You do this by +adding a `workspaces` key to the the `package.json` of your Volto project: + +```json +... +"workspaces": ["src/addons/my-volto-addon"], +... +``` + +It is common practice to use a star glob pattern for the workspaces: + +```json +... +"workspaces": ["src/addons/*"], +... +``` + +If you do this, make sure to always cleanup the `src/addons` folder whenever +you toggle the development status of an addon, as the existence of the addon +folder under the `src/addons` will still influence yarn. +Running `make install` again will do the trick and remove the not required anymore package. diff --git a/docs/source/addons/how-to-install-an-addon-prerelease.md b/docs/source/addons/how-to-install-an-addon-prerelease.md new file mode 100644 index 0000000000..a708383cfa --- /dev/null +++ b/docs/source/addons/how-to-install-an-addon-prerelease.md @@ -0,0 +1,51 @@ +--- +myst: + html_meta: + "description": "How to install a frontend add-on in your Volto project" + "property=og:description": "How to install a frontend add-on in your Volto project" + "property=og:title": "How to install a frontend add-on" + "keywords": "add-on, Volto, install" +--- + +# How to install an add-on in your Volto project (development or pre-release) + +You can install a Volto add-on just like any other JS package: + +```shell +pnpm --filter add +``` + +If the add-on is not published on the npm registry, [you can retrieve it directly from Github](https://pnpm.io/cli/add#install-from-git-repository): + +```shell +pnpm add collective/volto-dropdownmenu +``` + +Next, you'll need to add the add-on (identified by its JS package name) to the +`addons` key of your Volto project's `package.json`. + +```js +{ + "name": "my-nice-volto-project", + + "addons": [ + "acme-volto-foo-add-on", + "@plone/some-add-on", + "collective-another-volto-add-on" + ], + +} +``` + +```{warning} +Adding the add-on package to the `addons` key is mandatory! It allows Volto +to treat that package properly and provide it with BabelJS language +features. In Plone terminology, it is like including a Python egg to the +`zcml` section of `zc.buildout`. +``` + +```{seealso} +Alternatively, you can use `volto.config.js` to declare add-ons in your Plone project: +{doc}`../configuration/volto-config-js` +``` + diff --git a/docs/source/addons/how-to-install-an-addon-stable.md b/docs/source/addons/how-to-install-an-addon-stable.md new file mode 100644 index 0000000000..42c997faf1 --- /dev/null +++ b/docs/source/addons/how-to-install-an-addon-stable.md @@ -0,0 +1,51 @@ +--- +myst: + html_meta: + "description": "How to install a frontend add-on in your Plone project" + "property=og:description": "How to install a frontend add-on in your Plone project" + "property=og:title": "How to install a frontend add-on" + "keywords": "add-on, Volto, install" +--- + +# Configuring Volto to use a released add-on (stable release) + +You can install a Volto add-on just like any other JS package: + +```shell +yarn add name-of-add-on +``` + +If the add-on is not published on npm, you can retrieve it directly from Github: + +```shell +yarn add collective/volto-dropdownmenu +``` + +Next, you'll need to add the add-on (identified by its JS package name) to the +`addons` key of your Volto project's `package.json`. + +```js +{ + "name": "my-nice-volto-project", + + "addons": [ + "acme-volto-foo-add-on", + "@plone/some-add-on", + "collective-another-volto-add-on" + ], + +} +``` + +```{warning} +Adding the add-on package to the `addons` key is mandatory! It allows Volto +to treat that package properly and provide it with BabelJS language +features. In Plone terminology, it is like including a Python egg to the +`zcml` section of `zc.buildout`. +``` + +```{seealso} +Alternatively, you can use `volto.config.js` to declare add-ons in your Plone project: +{doc}`../configuration/volto-config-js` +``` + diff --git a/docs/source/addons/how-to-load-addon-configuration.md b/docs/source/addons/how-to-load-addon-configuration.md new file mode 100644 index 0000000000..a89decd0f2 --- /dev/null +++ b/docs/source/addons/how-to-load-addon-configuration.md @@ -0,0 +1,70 @@ +--- +myst: + html_meta: + "description": "Loading configuration from add-ons" + "property=og:description": "Loading configuration from add-ons" + "property=og:title": "Loading configuration from add-ons" + "keywords": "Volto, add-on, extensions, frontend, Plone, configuration" +--- + +# Loading configuration from add-ons + +As a convenience, an add-on can export configuration functions that can mutate, +in-place, the overall Volto {term}`configuration registry`. +An add-on can export multiple configurations methods, making it possible to selectively choose which specific add-on functionality you want to load. + +Some add-ons might choose to allow the Volto project to selectively load some of +their configuration, so they may offer additional configuration functions, +which you can load by overloading the add-on name in the `addons` package.json +key, like so: + +```{code-block} json +:emphasize-lines: 4 + +{ + "name": "my-nice-volto-project", + "addons": [ + "acme-volto-foo-add-on:loadOptionalBlocks,overrideSomeDefaultBlock", + "volto-ga" + ], +} +``` + +```{note} +The additional comma-separated names should be exported from the add-on +package's `index.js`. The main configuration function should be exported as +the default. An add-on's default configuration method will always be loaded. +``` + +If for some reason, you want to manually load the add-on, you could always do, +in your project's `config.js` module: + +```js +import loadExampleAddon, { enableOptionalBlocks } from 'volto-example-add-on'; +import * as voltoConfig from '@plone/volto/config'; + +const config = enableOptionalBlocks(loadExampleAddon(voltoConfig)); + +export blocks = { + ...config.blocks, +} +``` + +As this is a common operation, Volto provides a helper method for this: + +```js +import { applyConfig } from '@plone/volto/helpers'; +import * as voltoConfig from '@plone/volto/config'; + +const config = applyConfig([ + enableOptionalBlocks, + loadExampleAddon +], voltoConfig); + +export blocks = { + ...config.blocks, +} +``` + +The `applyConfig` helper ensures that each configuration methods returns the +config object, avoiding odd and hard to track errors when developing add-ons. diff --git a/docs/source/addons/how-to-testing-addons-prerelease.md b/docs/source/addons/how-to-testing-addons-prerelease.md new file mode 100644 index 0000000000..720464443b --- /dev/null +++ b/docs/source/addons/how-to-testing-addons-prerelease.md @@ -0,0 +1,13 @@ +--- +myst: + html_meta: + "description": "Testing add-ons (development or pre-release)" + "property=og:description": "Testing add-ons (development or pre-release)" + "property=og:title": "Testing add-ons (development or pre-release)" + "keywords": "Volto, Plone, Testing, CI, Add-ons" +--- + +# Testing add-ons (development or pre-release) + +% I have doubts if include this in a section on its own in "Development". +% In that section we would depict all the development process as a whole. diff --git a/docs/source/addons/how-to-testing-addons.md b/docs/source/addons/how-to-testing-addons.md new file mode 100644 index 0000000000..19373ea9c3 --- /dev/null +++ b/docs/source/addons/how-to-testing-addons.md @@ -0,0 +1,105 @@ +--- +myst: + html_meta: + "description": "Testing add-ons" + "property=og:description": "Testing add-ons" + "property=og:title": "Testing add-ons" + "keywords": "Volto, Plone, Testing, CI, Add-ons" +--- + +# Testing add-ons (stable release) + +We should let jest know about our aliases and make them available to it to resolve them, so in `package.json`: + +```{code-block} json +:emphasize-lines: 6 + + "jest": { + "moduleNameMapper": { + "@plone/volto/(.*)$": "/node_modules/@plone/volto/src/$1", + "@package/(.*)$": "/src/$1", + "@plone/some-volto-addon/(.*)$": "/src/addons/@plone/some-volto-addon/src/$1", + "my-volto-addon/(.*)$": "/src/addons/my-volto-addon/src/$1", + "~/(.*)$": "/src/$1" + }, +``` + +You can use `yarn test src/addons/addon-name` to run tests. + +## Jest configuration override + +In CI or for testing addons, it's interesting to provide an alternate Jest configuration +or slightly modify it. +Volto provide a way to do it using a `jest.config.js` file or pointing the test runner to a file of your choice, using `RAZZLE_JEST_CONFIG` environment variable. + +```shell +RAZZLE_JEST_CONFIG=my-custom-jest-config.js yarn test +``` + +```{note} +Both configurations are merged in a way that the keys of the config provided override the initial (`package.json`) default config, either in Volto or in your projects. +``` + +This is specially useful in CI while developing add-ons, so you can pass a specific configuration that deals with the add-on config properly. + +## Testing add-ons in isolation + +Testing an add-on in isolation as you would do when you develop a Plone Python backend add-on can be a bit challenging, since an add-on needs a working project in order to bootstrap itself. +The latest generator has the boilerplate needed in order to bootstrap a dockerized environment where you can run any test to your add-on. + +### Setup the environment + +Run once + +```shell +make dev +``` + +### Build the containers manually + +Run + +```shell +make build-backend +make build-addon +``` + +### Unit tests + +Run + +```shell +make test +``` + +### Acceptance tests + +Run once + +```shell +make install-acceptance +``` + +For starting the servers + +Run + +```shell +make start-test-acceptance-server +``` + +The frontend is run in dev mode, so development while writing tests is possible. + +Run + +```shell +make test-acceptance +``` + +To run Cypress tests afterwards. + +When finished, don't forget to shutdown the backend server. + +```shell +make stop-test-acceptance-server +``` diff --git a/docs/source/addons/how-to-troubleshoot-transpilation.md b/docs/source/addons/how-to-troubleshoot-transpilation.md new file mode 100644 index 0000000000..6e0404cf58 --- /dev/null +++ b/docs/source/addons/how-to-troubleshoot-transpilation.md @@ -0,0 +1,82 @@ +--- +myst: + html_meta: + "description": "Problems with untranspiled add-on dependencies" + "property=og:description": "Problems with untranspiled add-on dependencies" + "property=og:title": "Problems with untranspiled add-on dependencies" + "keywords": "Volto, add-on, extensions, frontend, Plone, configuration" +--- + +# Problems with untranspiled add-on dependencies + +```{note} +From Volto 18, the Babel support for ES specifications like the null coalescence operator has improved. +However, this procedure can be useful in other scenarios. +We are keeping it as reference. +``` + +When using external add-ons in your project, sometimes you will run into add-ons +that are not securely transpiled or haven't been transpiled at all. In that case +you might see an error like the following: + +```console +Module parse failed: Unexpected token (10:41) in @react-leaflet/core/esm/path.js +... +const options = props.pathOptions ?? {}; +... +``` + +Babel automatically transpiles the code in your add-on, but `node_modules` are +excluded from this process, so we need to include the add-on path in the list of +modules to be transpiled. This can be accomplished by customizing the webpack +configuration in the `razzle.config.js` file in your add-on. For example, +suppose that we want to use react-leaflet, which has a known transpilation +issue: + +```js +const path = require('path'); +const makeLoaderFinder = require('razzle-dev-utils/makeLoaderFinder'); + +const babelLoaderFinder = makeLoaderFinder('babel-loader'); + +const jsConfig = require('./jsconfig').compilerOptions; + +const pathsConfig = jsConfig.paths; +let voltoPath = './node_modules/@plone/volto'; +Object.keys(pathsConfig).forEach((pkg) => { + if (pkg === '@plone/volto') { + voltoPath = `./${jsConfig.baseUrl}/${pathsConfig[pkg][0]}`; + } +}); + +const { modifyWebpackConfig, plugins } = require(`${voltoPath}/razzle.config`); + +const customModifyWebpackConfig = ({ env, webpackConfig, webpackObject, options }) => { + const config = modifyWebpackConfig({ + env, + webpackConfig, + webpackObject, + options, + }); + const babelLoader = config.module.rules.find(babelLoaderFinder); + const { include } = babelLoader; + const corePath = path.join( + path.dirname(require.resolve('@react-leaflet/core')), + '..', + ); + const esmPath = path.join( + path.dirname(require.resolve('react-leaflet')), + '..', + ); + + include.push(corePath); + include.push(esmPath); + return config; +}; + +module.exports = { modifyWebpackConfig: customModifyWebpackConfig, plugins }; +``` + +First we need some setup to get the webpack configuration from Volto's configuration. +Once we have that, we need to resolve the path to the desired add-ons and push it +into the Babel loader include list. After this, the add-ons will load correctly. diff --git a/docs/source/addons/index.md b/docs/source/addons/index.md index ed13a38d17..c8de7c3695 100644 --- a/docs/source/addons/index.md +++ b/docs/source/addons/index.md @@ -7,538 +7,77 @@ myst: "keywords": "Volto, add-on, extensions, frontend, Plone" --- +%TODO: This is Explanation # Volto add-ons ```{toctree} :maxdepth: 1 +how-an-add-on-works +addon-configuration-pipeline +how-to-install-an-addon-stable +how-to-install-an-addon-prerelease +how-to-install-an-addon-dev-stable +how-to-install-an-addon-dev-prerelease +how-to-load-addon-configuration +how-to-create-an-addon-stable +how-to-create-an-addon-prerelease +how-to-testing-addons +how-to-extend-webpack-addon +how-to-extend-eslint-addon +how-to-troubleshoot-transpilation i18n best-practices theme public-folder ``` -There are several advanced scenarios where we might want to have more control -and flexibility beyond using the plain Volto project to build a site. - -We can build Volto {term}`add-on` products and make them available as generic -JavaScript packages that can be included in any Volto project. By doing so we -can provide code and component reutilization across projects and, of course, -benefit from open source collaboration. - -```{note} -By declaring a JavaScript package as a Volto add-on, Volto provides -several integration features: language features (so they can be transpiled -by Babel), whole-process customization via 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 Yarn. By using [mrs-develop](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. - -An add-on can be almost anything that a Volto project can be. They can: - -- provide additional views and blocks -- override or extend Volto's builtin views, blocks, settings -- shadow (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, load custom Razzle and Webpack plugins -- even provide a custom theme, just like a regular Volto project does. - -## Configuring a Volto project to use an add-on - -You can install a Volto add-on just like any other JS package: - -```shell -yarn add name-of-add-on +```{include} ./what-is-an-addon.md ``` -If the add-on is not published on npm, you can retrieve it directly from Github: - -```shell -yarn add collective/volto-dropdownmenu -``` - -Next, you'll need to add the add-on (identified by its JS package name) to the -`addons` key of your Volto project's `package.json`. More details in the next -section. - -### Loading add-on configuration - -As a convenience, an add-on can export configuration functions that can mutate, -in-place, the overall Volto {term}`configuration registry`. An add-on can export multiple -configurations methods, making it possible to selectively choose which specific -add-on functionality you want to load. - -In your Volto project's ``package.json`` you can allow the add-on to alter the -global configuration by adding, in the `addons` key, a list of Volto add-on -package names, like: - -```js -{ - "name": "my-nice-volto-project", +## Configuring Volto to use a frontend add-on - "addons": [ - "acme-volto-foo-add-on", - "@plone/some-add-on", - "collective-another-volto-add-on" - ], +Volto can be configured to use multiple add-ons. +You have to install the code and then enable the add-on in the configuration. +You can install the code by installing a released add-on package in the setup, or use a development add-on package. +A development add-on package can be either local to the Plone project or as a repo checkout. -} -``` +### Installing a released add-on -```{warning} -Adding the add-on package to the `addons` key is mandatory! It allows Volto -to treat that package properly and provide it with BabelJS language -features. In Plone terminology, it is like including a Python egg to the -`zcml` section of zc.buildout. -``` +This is the most common use case, you want to install a Volto add-on that has been released as a in npm registry (or alike). +These are the instructions for the stable release. -Some add-ons might choose to allow the Volto project to selectively load some of -their configuration, so they may offer additional configuration functions, -which you can load by overloading the add-on name in the `addons` package.json -key, like so: +{doc}`./how-to-install-an-addon-stable` -```{code-block} json -:emphasize-lines: 4 +### Installing a released add-on (development or pre-release) -{ - "name": "my-nice-volto-project", - "addons": [ - "acme-volto-foo-add-on:loadOptionalBlocks,overrideSomeDefaultBlock", - "volto-ga" - ], -} -``` +These are the instructions for the development or pre-release. -```{note} -The additional comma-separated names should be exported from the add-on -package's ``index.js``. The main configuration function should be exported as -the default. An add-on's default configuration method will always be loaded. -``` +{doc}`./how-to-install-an-addon-prerelease` -If for some reason, you want to manually load the add-on, you could always do, -in your project's ``config.js`` module: +### Installing an add-on in development mode -```js -import loadExampleAddon, { enableOptionalBlocks } from 'volto-example-add-on'; -import * as voltoConfig from '@plone/volto/config'; +It is also usual that you develop an add-on at the same time that you are developing a project. +These are the instructions for the stable release. -const config = enableOptionalBlocks(loadExampleAddon(voltoConfig)); +{doc}`./how-to-install-an-addon-dev-stable` -export blocks = { - ...config.blocks, -} -``` +### Installing an add-on in development mode (development or pre-release) -As this is a common operation, Volto provides a helper method for this: +{doc}`./how-to-install-an-addon-dev-prerelease` -```js -import { applyConfig } from '@plone/volto/helpers'; -import * as voltoConfig from '@plone/volto/config'; - -const config = applyConfig([ - enableOptionalBlocks, - loadExampleAddon -], voltoConfig); +### Loading add-on configuration -export blocks = { - ...config.blocks, -} -``` +Add-ons can provide configuration: -The `applyConfig` helper ensures that each configuration methods returns the -config object, avoiding odd and hard to track errors when developing add-ons. +{doc}`./how-to-load-addon-configuration` ## Creating add-ons -Volto add-on packages are just CommonJS packages. The only requirement is that -they point the `main` key of their `package.json` to a module that exports, as -a default function that acts as a {term}`Volto configuration loader`. - -Although you could simply use `npm init` to generate an add-on initial code, -we now have a nice -[Yeoman-based generator](https://github.com/plone/generator-volto) that you can use: - -```shell -npm install -g @plone/generator-volto -yo @plone/volto:addon [] [options] -``` - -Volto will automatically provide aliases for your (unreleased) package, so that -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. - -### Use mrs-developer to manage the development cycle - -#### Add mrs-developer dependency and related script - -[Eric Brehault](https://github.com/ebrehault) ported this amazing Python tool, -which provides a way to pull a package from git and set it up as a dependency -for the current project codebase. - -To facilitate add-on development lifecycle we recommend using -[mrs-developer](https://www.npmjs.com/package/mrs-developer). - -By doing this, you can develop both the project and the add-on product as if -they were both part of the current codebase. Once the add-on development is -done, you can publish the package to an npm repository. - -```shell -yarn add mrs-developer -``` - -Then, in `package.json`: - -```{code-block} json -:emphasize-lines: 2 -"scripts": { - "develop": "missdev --config=jsconfig.json --output=addons", -} -``` - -We can configure `mrs-developer` to use any directory that you want. Here we -are telling it to create the directory `src/addons` and put the packages -managed by `mrs-developer` inside. - -#### mrs.developer.json - -This is the configuration file that instructs `mrs-developer` from where it has -to pull the packages. So, create `mrs.developer.json` and add: - -```json -{ - "acme-volto-foo-add-on": { - "package": "@acme/volto-foo-add-on", - "url": "git@github.com:acme/my-volto-add-on.git", - "path": "src" - } -} -``` - -Then run: - -```shell -make develop -``` - -Now the add-on is found in `src/addons/`. - -```{note} -`package` property is optional, set it up only if your package has a scope. -`src` is required if the content of your add-on is located in the `src` -directory (but, as that is the convention recommended for all Volto add-on -packages, you will always include it) -``` - -If you want to know more about `mrs-developer` config options, please refer to -[its npm page](https://www.npmjs.com/package/mrs-developer). - -#### tsconfig.json / jsconfig.json - -`mrs-developer` automatically creates this file for you, but if you choose not -to use mrs-developer, you'll have to add something like this to your -`tsconfig.json` or `jsconfig.json` file in the Volto project root: - -```json -{ - "compilerOptions": { - "paths": { - "acme-volto-foo-add-on": [ - "addons/acme-volto-foo-add-on/src" - ] - }, - "baseUrl": "src" - } -} -``` - -```{warning} -Please note that both `paths` and `baseUrl` are required to match your -project layout. -``` - -```{tip} -You should use the `src` path inside your package and point the `main` key -in `package.json` to the `index.js` file in `src/index.js`. -``` - -### Customizations - -add-on packages can include customization folders, just like the Volto projects. -The customizations are resolved in the order: add-ons (as sorted in the `addons` -key of your project's `package.json`) then the customizations in the Volto -project, last one wins. - -```{tip} -See the {ref}`advanced-customization-scenarios-label` -section on how to enhance this pattern and how to include customizations -inside add-ons. -``` - -### Providing add-on configuration - -The default export of your add-on main `index.js` file should be a function with -the signature ``config => config``. -That is, it should take the ``global`` configuration object and return it, -possibly mutated or changed. So your main `index.js` will look like: - -```js -export default function applyConfig(config) { - config.blocks.blocksConfig.faq_viewer = { - id: 'faq_viewer', - title: 'FAQ Viewer', - edit: FAQBlockEdit, - view: FAQBlockView, - icon: chartIcon, - group: 'common', - restricted: false, - mostUsed: true, - sidebarTab: 1, - }; - return config; -} -``` - -And the `package.json` file of your add-on: - -```json -{ - "main": "src/index.js", -} -``` - -```{warning} -An add-on's default configuration method will always be loaded. -``` - -#### Multiple add-on configurations - -You can export additional configuration functions from your add-on's main -`index.js`. - -```js -import applyConfig, {loadOptionalBlocks,overrideSomeDefaultBlock} from './config'; - -export { loadOptionalBlocks, overrideSomeDefaultBlock }; -export default applyConfig; -``` - -## Add third-party dependencies to your add-on - -If you're developing the add-on and you wish to add an external dependency, you'll have to switch your project to be a [Yarn Workspaces root](https://yarnpkg.com/features/workspaces). - -So you'll need to add, in your Volto project's `package.json`: - -```json -"private": true, -"workspaces": [], -``` - -Then populate the `workspaces` key with the path to your development add-ons: - -```json -"workspaces": [ - "src/addons/my-volto-add-on" -] -``` -You'll have to manage the add-on dependencies via the workspace root (your Volto -project). For example, to add a new dependency: - -```shell -yarn workspace @plone/my-volto-add-on add some-third-party-package -``` - -You can run `yarn workspaces info` to see a list of workspaces defined. - -In case you want to add new dependencies to the Volto project, now you'll have -to run the `yarn add` command with the `-W` switch: - -```shell -yarn add -W some-dependency -``` - -## Extending Razzle from an add-on - -Just like you can extend Razzle's configuration from the project, you can do so -with an add-on, as well. You should provide a `razzle.extend.js` file in your -add-on root folder. An example of such file where the theme.config alias is -changed, to enable a custom Semantic theme inside the add-on: - - -```js -const plugins = (defaultPlugins) => { - return defaultPlugins; -}; -const modify = (config, { target, dev }, webpack) => { - const themeConfigPath = `${__dirname}/theme/theme.config`; - config.resolve.alias['../../theme.config$'] = themeConfigPath; - - return config; -}; - -module.exports = { - plugins, - modify, -}; -``` - -## Extending Eslint configuration from an add-on - -Starting with Volto v16.4.0, you can also customize the Eslint configuration -from an add-on. You should provide a `eslint.extend.js` file in your -add-on root folder, which exports a `modify(defaultConfig)` function. For -example, to host some code outside the regular `src/` folder of your add-on, -this `eslint.extend.js` file is needed: - -```js -const path = require('path'); - -module.exports = { - modify(defaultConfig) { - const aliasMap = defaultConfig.settings['import/resolver'].alias.map; - const addonPath = aliasMap.find( - ([name]) => name === '@plone-collective/some-volto-add-on', - )[1]; - - const extraPath = path.resolve(`${addonPath}/../extra`); - aliasMap.push(['@plone-collective/extra', extraPath]); - - return defaultConfig; - }, -}; -``` - -This would allow the `@plone-collective/some-volto-add-on` to host some code -outside of its normal `src/` folder, let's say in the `extra` folder, and that -code would be available under the `@plone-collective/extra` name. Note: this is -taking care only of the Eslint integration. For proper language support, you'll -still need to do it in the `razzle.extend.js` of your add-on. - -## add-on dependencies - -Sometimes your add-on depends on another add-on. You can declare add-on dependency -in your add-on's `addons` key, just like you do in your project. By doing so, -that other add-on's configuration loader is executed first, so you can depend on -the configuration being already applied. Another benefit is that you'll have -to declare only the "top level" add-on in your project, the dependencies will be -discovered and automatically treated as Volto add-ons. For example, `volto-slate` -depends on `volto-object-widget`'s configuration being already applied, so -`volto-slate` can declare in its `package.json`: - -```json -{ - "name": "volto-slate", - - "addons": ["@eeacms/volto-object-widget"] -} -``` - -And of course, the dependency add-on can depend, on its turn, on other add-ons -which will be loaded as well. Circular dependencies should be avoided. - -## Problems with untranspiled add-on dependencies - -When using external add-ons in your project, sometimes you will run into add-ons -that are not securely transpiled or haven't been transpiled at all. In that case -you might see an error like the following: - -```console -Module parse failed: Unexpected token (10:41) in @react-leaflet/core/esm/path.js -... -const options = props.pathOptions ?? {}; -... -``` - -Babel automatically transpiles the code in your add-on, but `node_modules` are -excluded from this process, so we need to include the add-on path in the list of -modules to be transpiled. This can be accomplished by customizing the webpack -configuration in the `razzle.config.js` file in your add-on. For example, -suppose that we want to use react-leaflet, which has a known transpilation -issue: - -```js -const path = require('path'); -const makeLoaderFinder = require('razzle-dev-utils/makeLoaderFinder'); - -const babelLoaderFinder = makeLoaderFinder('babel-loader'); - -const jsConfig = require('./jsconfig').compilerOptions; - -const pathsConfig = jsConfig.paths; -let voltoPath = './node_modules/@plone/volto'; -Object.keys(pathsConfig).forEach((pkg) => { - if (pkg === '@plone/volto') { - voltoPath = `./${jsConfig.baseUrl}/${pathsConfig[pkg][0]}`; - } -}); - -const { modifyWebpackConfig, plugins } = require(`${voltoPath}/razzle.config`); - -const customModifyWebpackConfig = ({ env, webpackConfig, webpackObject, options }) => { - const config = modifyWebpackConfig({ - env, - webpackConfig, - webpackObject, - options, - }); - const babelLoader = config.module.rules.find(babelLoaderFinder); - const { include } = babelLoader; - const corePath = path.join( - path.dirname(require.resolve('@react-leaflet/core')), - '..', - ); - const esmPath = path.join( - path.dirname(require.resolve('react-leaflet')), - '..', - ); - - include.push(corePath); - include.push(esmPath); - return config; -}; - -module.exports = { modifyWebpackConfig: customModifyWebpackConfig, plugins }; -``` - -First we need some setup to get the webpack configuration from Volto's configuration. -Once we have that, we need to resolve the path to the desired add-ons and push it -into the Babel loader include list. After this, the add-ons will load correctly. - -## Testing add-ons - -We should let jest know about our aliases and make them available to it to -resolve them, so in `package.json`: - -```{code-block} json -:emphasize-lines: 6 - -"jest": { - "moduleNameMapper": { - "@plone/volto/(.*)$": "/node_modules/@plone/volto/src/$1", - "@package/(.*)$": "/src/$1", - "@plone/some-volto-add-on/(.*)$": "/src/addons/@plone/some-volto-add-on/src/$1", - "my-volto-add-on/(.*)$": "/src/addons/my-volto-add-on/src/$1", - "~/(.*)$": "/src/$1" - }, -``` - -```{tip} -We're in the process of moving the default scaffolding generators to -provide a `jest.config.js` file in Volto, making this step unneeded. -``` +In case you want to create your own add-on, here you can find the instructions: -You can use `yarn test src/addons/add-on-name` to run tests. +{doc}`./how-to-create-an-addon-stable` -## Code linting +### Creating add-ons (development or pre-release) -If you have generated your Volto project recently (after the summer of 2020), -you don't have to do anything to have automatic integration with ESLint, -otherwise make sure to upgrade your project's `.eslintrc` to the `.eslintrc.js` -version, according to the {doc}`../upgrade-guide/index`. +{doc}`./how-to-create-an-addon-prerelease` diff --git a/docs/source/addons/public-folder.md b/docs/source/addons/public-folder.md index 188a9e155a..09409dd167 100644 --- a/docs/source/addons/public-folder.md +++ b/docs/source/addons/public-folder.md @@ -7,7 +7,7 @@ myst: "keywords": "Volto, Plone, Semantic UI, CSS, Volto theme, add-on, static, assets, files, build" --- -# Add static files from your add-on to your build +# How to add static files from your add-on to your build In the Volto build process, you can add static files to your build, then serve them along with the compiled files. Static files are not transformed or compiled by the build process. diff --git a/docs/source/addons/what-is-an-addon.md b/docs/source/addons/what-is-an-addon.md new file mode 100644 index 0000000000..5c97cca7a1 --- /dev/null +++ b/docs/source/addons/what-is-an-addon.md @@ -0,0 +1,45 @@ +--- +myst: + html_meta: + "description": "What is a Volto add-on" + "property=og:description": "What is a Volto add-on" + "property=og:title": "What is a Volto add-on" + "keywords": "add-on, Volto, create" +--- +%Explanation +# What is a Volto add-on + +There are several advanced scenarios where we might want to have more control and flexibility beyond using the plain Volto project to build a site. + +We can build Volto {term}`add-on` products and make them available as generic JavaScript packages that can be included in any Volto project. +By doing so we can provide code and component reutilization across projects and, of course, benefit from open source collaboration. + +Volto add-on packages are just CommonJS/ESM packages. +The only requirement is that they point the `main` key of their `package.json` to a module that exports, as a default function that acts as a {term}`Volto configuration loader`. + +Volto will automatically provide aliases for your (unreleased) package, so that +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: language features (so they can be transpiled +by Babel), whole-process customization via 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. + +An add-on can be almost anything that a Volto project can be. They can: + +- provide additional views and blocks +- override or extend Volto's builtin views, blocks, settings +- shadow (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, load custom Razzle and Webpack plugins +- even provide a custom theme, just like a regular Volto project does. From d1b20196eeb0027c3494b3ff7a4a74989946aee0 Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Sun, 13 Oct 2024 21:13:05 -1000 Subject: [PATCH 2/2] - Hyphenate add-on almost everywhere - Fix references --- docs/source/_static/plone-home-page.png | Bin 0 -> 123366 bytes ...ne.md => add-on-configuration-pipeline.md} | 0 docs/source/addons/how-an-add-on-works.md | 6 +-- ... => how-to-create-an-add-on-prerelease.md} | 6 +-- ...e.md => how-to-create-an-add-on-stable.md} | 0 ...ddon.md => how-to-extend-eslint-add-on.md} | 0 ...don.md => how-to-extend-webpack-add-on.md} | 0 ...ow-to-install-an-add-on-dev-prerelease.md} | 0 ...=> how-to-install-an-add-on-dev-stable.md} | 4 -- ...=> how-to-install-an-add-on-prerelease.md} | 0 ....md => how-to-install-an-add-on-stable.md} | 0 ...md => how-to-load-add-on-configuration.md} | 0 ...e.md => how-to-test-add-ons-prerelease.md} | 0 ...sting-addons.md => how-to-test-add-ons.md} | 0 docs/source/addons/index.md | 39 +++++++++--------- ...at-is-an-addon.md => what-is-an-add-on.md} | 0 16 files changed, 26 insertions(+), 29 deletions(-) create mode 100644 docs/source/_static/plone-home-page.png rename docs/source/addons/{addon-configuration-pipeline.md => add-on-configuration-pipeline.md} (100%) rename docs/source/addons/{how-to-create-an-addon-prerelease.md => how-to-create-an-add-on-prerelease.md} (99%) rename docs/source/addons/{how-to-create-an-addon-stable.md => how-to-create-an-add-on-stable.md} (100%) rename docs/source/addons/{how-to-extend-eslint-addon.md => how-to-extend-eslint-add-on.md} (100%) rename docs/source/addons/{how-to-extend-webpack-addon.md => how-to-extend-webpack-add-on.md} (100%) rename docs/source/addons/{how-to-install-an-addon-dev-prerelease.md => how-to-install-an-add-on-dev-prerelease.md} (100%) rename docs/source/addons/{how-to-install-an-addon-dev-stable.md => how-to-install-an-add-on-dev-stable.md} (99%) rename docs/source/addons/{how-to-install-an-addon-prerelease.md => how-to-install-an-add-on-prerelease.md} (100%) rename docs/source/addons/{how-to-install-an-addon-stable.md => how-to-install-an-add-on-stable.md} (100%) rename docs/source/addons/{how-to-load-addon-configuration.md => how-to-load-add-on-configuration.md} (100%) rename docs/source/addons/{how-to-testing-addons-prerelease.md => how-to-test-add-ons-prerelease.md} (100%) rename docs/source/addons/{how-to-testing-addons.md => how-to-test-add-ons.md} (100%) rename docs/source/addons/{what-is-an-addon.md => what-is-an-add-on.md} (100%) diff --git a/docs/source/_static/plone-home-page.png b/docs/source/_static/plone-home-page.png new file mode 100644 index 0000000000000000000000000000000000000000..b2321e0eaf76b0bfe72d03a81725099c8e195af6 GIT binary patch literal 123366 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

tLmaIhuyA{(H0;1>y&`$I2y<$!3n)rw56 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 config`. @@ -73,7 +73,7 @@ So the Volto add-on needs to export a default function that receives the Volto c Volto will chain-execute all the add-on configuration functions to compute the final configuration registry. -```{info} +```{note} An add-on's default configuration method will always be loaded. ``` @@ -90,7 +90,7 @@ export default applyConfig; ``` ```{seealso} -{doc}`./how-to-load-addon-configuration` +{doc}`how-to-load-add-on-configuration` ``` ## Customizations diff --git a/docs/source/addons/how-to-create-an-addon-prerelease.md b/docs/source/addons/how-to-create-an-add-on-prerelease.md similarity index 99% rename from docs/source/addons/how-to-create-an-addon-prerelease.md rename to docs/source/addons/how-to-create-an-add-on-prerelease.md index 2c8334b540..e34f4fadeb 100644 --- a/docs/source/addons/how-to-create-an-addon-prerelease.md +++ b/docs/source/addons/how-to-create-an-add-on-prerelease.md @@ -15,7 +15,7 @@ This chapter describes how you can create a Volto add-on using the latest **deve {term}`Cookieplone` is now the method to create a Plone add-on with unstable versions of Volto, version 18.0.0-alpha.43 and above. ``` -Follow the steps required to install [Cookieplone]({doc}`plone:install/create-project-cookieplone.md`). +Follow the steps required to install Cookieplone as described in {doc}`plone:install/create-project-cookieplone`. ```shell pipx run cookieplone frontend_addon @@ -114,7 +114,7 @@ To install the frontend setup, use the following command. make install ``` -### Start Plone backend Docker container +## Start Plone backend Docker container In the currently open session, issue the following command. @@ -146,7 +146,7 @@ Starting server in PID 1. This will start a clean Plone server for development purposes so you can start developing your add-on. -### Start Plone development frontend +## Start Plone development frontend Create a second shell session in a new window. Change your current working directory to {file}`volto-addon`. diff --git a/docs/source/addons/how-to-create-an-addon-stable.md b/docs/source/addons/how-to-create-an-add-on-stable.md similarity index 100% rename from docs/source/addons/how-to-create-an-addon-stable.md rename to docs/source/addons/how-to-create-an-add-on-stable.md diff --git a/docs/source/addons/how-to-extend-eslint-addon.md b/docs/source/addons/how-to-extend-eslint-add-on.md similarity index 100% rename from docs/source/addons/how-to-extend-eslint-addon.md rename to docs/source/addons/how-to-extend-eslint-add-on.md diff --git a/docs/source/addons/how-to-extend-webpack-addon.md b/docs/source/addons/how-to-extend-webpack-add-on.md similarity index 100% rename from docs/source/addons/how-to-extend-webpack-addon.md rename to docs/source/addons/how-to-extend-webpack-add-on.md diff --git a/docs/source/addons/how-to-install-an-addon-dev-prerelease.md b/docs/source/addons/how-to-install-an-add-on-dev-prerelease.md similarity index 100% rename from docs/source/addons/how-to-install-an-addon-dev-prerelease.md rename to docs/source/addons/how-to-install-an-add-on-dev-prerelease.md diff --git a/docs/source/addons/how-to-install-an-addon-dev-stable.md b/docs/source/addons/how-to-install-an-add-on-dev-stable.md similarity index 99% rename from docs/source/addons/how-to-install-an-addon-dev-stable.md rename to docs/source/addons/how-to-install-an-add-on-dev-stable.md index f2a4fd975a..d1837f1d3e 100644 --- a/docs/source/addons/how-to-install-an-addon-dev-stable.md +++ b/docs/source/addons/how-to-install-an-add-on-dev-stable.md @@ -123,17 +123,13 @@ you'll have to set your addon package as a "Yarn workspace". You do this by adding a `workspaces` key to the the `package.json` of your Volto project: ```json -... "workspaces": ["src/addons/my-volto-addon"], -... ``` It is common practice to use a star glob pattern for the workspaces: ```json -... "workspaces": ["src/addons/*"], -... ``` If you do this, make sure to always cleanup the `src/addons` folder whenever diff --git a/docs/source/addons/how-to-install-an-addon-prerelease.md b/docs/source/addons/how-to-install-an-add-on-prerelease.md similarity index 100% rename from docs/source/addons/how-to-install-an-addon-prerelease.md rename to docs/source/addons/how-to-install-an-add-on-prerelease.md diff --git a/docs/source/addons/how-to-install-an-addon-stable.md b/docs/source/addons/how-to-install-an-add-on-stable.md similarity index 100% rename from docs/source/addons/how-to-install-an-addon-stable.md rename to docs/source/addons/how-to-install-an-add-on-stable.md diff --git a/docs/source/addons/how-to-load-addon-configuration.md b/docs/source/addons/how-to-load-add-on-configuration.md similarity index 100% rename from docs/source/addons/how-to-load-addon-configuration.md rename to docs/source/addons/how-to-load-add-on-configuration.md diff --git a/docs/source/addons/how-to-testing-addons-prerelease.md b/docs/source/addons/how-to-test-add-ons-prerelease.md similarity index 100% rename from docs/source/addons/how-to-testing-addons-prerelease.md rename to docs/source/addons/how-to-test-add-ons-prerelease.md diff --git a/docs/source/addons/how-to-testing-addons.md b/docs/source/addons/how-to-test-add-ons.md similarity index 100% rename from docs/source/addons/how-to-testing-addons.md rename to docs/source/addons/how-to-test-add-ons.md diff --git a/docs/source/addons/index.md b/docs/source/addons/index.md index c8de7c3695..970f573286 100644 --- a/docs/source/addons/index.md +++ b/docs/source/addons/index.md @@ -14,17 +14,18 @@ myst: :maxdepth: 1 how-an-add-on-works -addon-configuration-pipeline -how-to-install-an-addon-stable -how-to-install-an-addon-prerelease -how-to-install-an-addon-dev-stable -how-to-install-an-addon-dev-prerelease -how-to-load-addon-configuration -how-to-create-an-addon-stable -how-to-create-an-addon-prerelease -how-to-testing-addons -how-to-extend-webpack-addon -how-to-extend-eslint-addon +add-on-configuration-pipeline +how-to-install-an-add-on-stable +how-to-install-an-add-on-prerelease +how-to-install-an-add-on-dev-stable +how-to-install-an-add-on-dev-prerelease +how-to-load-add-on-configuration +how-to-create-an-add-on-stable +how-to-create-an-add-on-prerelease +how-to-test-add-ons +how-to-test-add-ons-prerelease +how-to-extend-webpack-add-on +how-to-extend-eslint-add-on how-to-troubleshoot-transpilation i18n best-practices @@ -32,7 +33,7 @@ theme public-folder ``` -```{include} ./what-is-an-addon.md +```{include} what-is-an-add-on.md ``` ## Configuring Volto to use a frontend add-on @@ -47,37 +48,37 @@ A development add-on package can be either local to the Plone project or as a re This is the most common use case, you want to install a Volto add-on that has been released as a in npm registry (or alike). These are the instructions for the stable release. -{doc}`./how-to-install-an-addon-stable` +{doc}`how-to-install-an-add-on-stable` ### Installing a released add-on (development or pre-release) These are the instructions for the development or pre-release. -{doc}`./how-to-install-an-addon-prerelease` +{doc}`how-to-install-an-add-on-prerelease` ### Installing an add-on in development mode It is also usual that you develop an add-on at the same time that you are developing a project. These are the instructions for the stable release. -{doc}`./how-to-install-an-addon-dev-stable` +{doc}`how-to-install-an-add-on-dev-stable` ### Installing an add-on in development mode (development or pre-release) -{doc}`./how-to-install-an-addon-dev-prerelease` +{doc}`how-to-install-an-add-on-dev-prerelease` ### Loading add-on configuration Add-ons can provide configuration: -{doc}`./how-to-load-addon-configuration` +{doc}`how-to-load-add-on-configuration` ## Creating add-ons In case you want to create your own add-on, here you can find the instructions: -{doc}`./how-to-create-an-addon-stable` +{doc}`how-to-create-an-add-on-stable` ### Creating add-ons (development or pre-release) -{doc}`./how-to-create-an-addon-prerelease` +{doc}`how-to-create-an-add-on-prerelease` diff --git a/docs/source/addons/what-is-an-addon.md b/docs/source/addons/what-is-an-add-on.md similarity index 100% rename from docs/source/addons/what-is-an-addon.md rename to docs/source/addons/what-is-an-add-on.md